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
    {      
    }
};

如果您注释两条标记的行,编译器 (Visual Studio 2010) 在 /W4 上编译时会发出以下警告。

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

是什么让这两行如此特别?为什么它们的存在允许生成赋值运算符?

4

1 回答 1

7

这种行为的原因tcp::acceptor是不可复制(它继承自basic_io_object,其复制赋值运算符是私有的,因此它自己的复制赋值运算符没有被隐式声明)。拥有不可复制的成员可以避免生成隐式声明的复制赋值运算符,但不会引发警告,因为这被认为是预期的行为。

另一方面,如果你注释掉这两行,你的类就只剩下一个引用成员;这也使您的类不可复制,但根据 Visual Studio 文档确实会发出警告。我同意这也是意料之中的,但编译器实现者决定给你一个警告以防万一。原因可能是使一个类显式不可复制(例如 的情况basic_io_object)是一个明确的设计决策,但我只是在这里猜测。

于 2012-12-05T09:23:33.470 回答