C++ 无法将可移动对象与Boost.Asio一起使用
在阅读中,我得到了这样一个印象:这个代码应该可以工作:C++ 无法将可移动对象与Boost.Asio一起使用,c++,boost,c++11,boost-asio,C++,Boost,C++11,Boost Asio,在阅读中,我得到了这样一个印象:这个代码应该可以工作: class Connection : public std::enable_shared_from_this<Connection> { public: Connection(tcp::socket&& socket) : socket_(std::move(socket)) {} private: tcp::socket socket_; }; 在包含ASIO头之前,需要定义BOOST\u A
class Connection : public std::enable_shared_from_this<Connection>
{
public:
Connection(tcp::socket&& socket) : socket_(std::move(socket)) {}
private:
tcp::socket socket_;
};
在包含ASIO头之前,需要定义
BOOST\u ASIO\u MOVE
。如果没有,则移动支持将被禁用。请参阅asio/basic\U stream\U socket.hpp
您能展示调用
Connecion
constructor的代码吗?@Igor:我在main()中使用了另一个服务器类,但连接类没有在任何地方使用。它只是声明的,所以您在调用隐式删除的复制构造函数时遇到了一个错误,但是没有代码构造连接
对象?编译器是否提供错误实例化位置的跟踪?当调用构造函数的代码将套接字作为右值引用传递,而不是通过std::move
将其转换为xvalue时,这个问题就会出现。这是突出显示的部分:std::move(socket)。据我所见,问题在于tcp::socket定义了一个移动构造函数,但没有复制构造函数,因此隐式复制构造函数被删除。请编辑您的问题,以包含一个演示该问题的最完整示例。明确地定义BOOST\u ASIO\u HAS\u MOVE对我不起作用。我不得不修改/usr/include/boost/asio/detail/config.hpp
。我已经添加了//Clang/libc++detection
,并替换了//在已知允许移动构造和赋值的编译器上支持移动构造和赋值。
部分来自:
Call to implicitly-deleted copy constructor of 'tcp::socket' (aka'basic_stream_socket<boost::asio::ip::tcp>')
C++ Language dialect: GNU++11[-std=gnu++11]
C++ Standard Library: libc++(LLVM C++ standard library with C++11 support)