1

ブースト Asio を使用していますが、次の関数がコンパイルされません。

udp::resolver Create_UDP_Socket(){
    boost::asio::io_service io_service;
    udp::socket s(io_service, udp::endpoint(udp::v4(), 0));
    udp::resolver resolver(io_service);
    return resolver;
}

エラー: 削除された関数の使用

boost::asio::ip::basic_resolver::basic_resolver(定数ブースト::asio::ip::basic_resolver&)

リゾルバーを返す最良の方法は何ですか? 移動セマンティクスでできることはありますか、それともリゾルバーへのポインターを作成して返す必要がありますか? (どのような種類: 共有/一意?)

編集:これは機能します:

std::shared_ptr<udp::resolver> Create_UDP_Socket(){
    boost::asio::io_service io_service;
    udp::socket s(io_service, udp::endpoint(udp::v4(), 0));
    std::shared_ptr<udp::resolver> resolver(new udp::resolver{io_service});
    return resolver;
}

クラスへのポインタを作成せずにクラスを返すことができるかどうか、私はまだ興味があります。

4

1 に答える 1

4

1 つのオブジェクトへのスマート ポインターを返すことで、オブジェクトのコピーを回避できます。

boost::shared_ptr<udp::resolver> Create_UDP_Socket(){
    boost::asio::io_service io_service;
    udp::socket s(io_service, udp::endpoint(udp::v4(), 0));
    return boost::shared_ptr<udp::resolver>( new resolver(io_service) );
}

またはstd::shared_ptrstd::unique_ptr機能します。

于 2013-04-02T18:36:09.277 に答える