8

boost::asio を使用する次のコードを見てください。

#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class SocketTest
{

private:            

    boost::asio::io_service& mIOService;
    tcp::acceptor mAcceptor; // Comment this line

public:

    SocketTest(boost::asio::io_service& io_service)
        : mIOService(io_service)
        , mAcceptor(io_service, tcp::endpoint(tcp::v4(), 8080)) // Comment this line
    {      
    }
};

タグ付けされた 2 行にコメントを付けると、コンパイラ (Visual Studio 2010) は /W4 でのコンパイル時に次の警告を出します。

warning C4512: 'SocketTest' : assignment operator could not be generated

この 2 行が特別な理由は何ですか? それらの存在により代入演算子の生成が可能になるのはなぜですか?

4

1 に答える 1

7

この動作の理由は、 がコピー可能ではないことです (コピー代入演算子がプライベートであるため、独自のコピー代入演算子が暗黙的に宣言されていないtcp::acceptorから継承されます)。basic_io_objectコピー不可能なメンバーを持つと、暗黙的に宣言されたコピー代入演算子の生成が回避されますが、これは予期される動作と見なされるため、警告は発生しません。

一方、これらの 2 行をコメント アウトすると、クラスには参照メンバーだけが残ります。これにより、クラスもコピーできなくなりますが、Visual Studio のドキュメントに従って警告が発生します。これも当然のことであることに同意しますが、コンパイラの実装者は念のために警告を出すことにしました。その理由は、クラスを明示的にコピー不可にすること ( の場合などbasic_io_object) が明示的な設計上の決定である可能性がありますが、ここでは推測しています。

于 2012-12-05T09:23:33.470 に答える