2012-12-05 63 views
8

拿下面一段使用boost :: asio的代码。奇怪的C4512警告。为什么?

#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 

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

回答

7

此行为的原因是tcp::acceptor不可复制(它从basic_io_object继承,其复制赋值运算符是私有的,因此它自己的复制赋值运算符不会隐式声明)。拥有不可复制的成员可以避免生成隐式声明的复制赋值运算符,但不会引发警告,因为这被认为是预期的行为。另一方面,如果你注释掉这两行,你的班级只剩下一个参考成员;这也会使你的类不可复制,但是会根据Visual Studio文档提出警告。我同意这也是预料之中的,但编译器实施者决定给你一个警告以防万一。原因可能是让一个类明确不可复制(例如basic_io_object)是一个明确的设计决定,但我只是在这里猜测。

+0

啊,是的。你似乎是对的。继承boost :: noncopyable解决了警告。这也解释了为什么我尝试用原子类型(int&和int)重新创建问题不会重新创建问题。非常感谢。 – UberMongoose

+0

从未来更新:在C++ 11中有更好的方法来处理这个问题:http://stackoverflow.com/questions/9458741/with-explicitly-deleted-member-functions-in-c11-is-it-still -worthwhile到INH – Tim