Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的C4512警告。为什么?_C++_Boost_Warnings_Boost Asio - Fatal编程技术网

C++ 奇怪的C4512警告。为什么?

C++ 奇怪的C4512警告。为什么?,c++,boost,warnings,boost-asio,C++,Boost,Warnings,Boost Asio,以下面使用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(boos

以下面使用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
    {      
    }
};

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

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


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

啊,是的。你似乎是对的。从boost::noncopyable继承解决了警告问题。它还解释了为什么我试图用原子类型(int&和int)重新创建问题时没有重新创建问题。非常感谢。来自未来的更新:在C++11中,有一种更好的方法来处理此问题:
warning C4512: 'SocketTest' : assignment operator could not be generated