不能使用可移动对象与Boost.Asio。

7

阅读这篇文章,我认为这段代码应该是有效的:

class Connection : public std::enable_shared_from_this<Connection>
{
public:
    Connection(tcp::socket&& socket) : socket_(std::move(socket)) {}
private:
    tcp::socket socket_;
};

但编译器在构造函数中报告了以下错误:
Call to implicitly-deleted copy constructor of 'tcp::socket' (aka'basic_stream_socket<boost::asio::ip::tcp>')

我还定义了BOOST_ASIO_HAS_MOVE。我使用的是Xcode 4.6.3,在编译器设置中我已经定义了以下内容:

C++ Language dialect: GNU++11[-std=gnu++11]
C++ Standard Library: libc++(LLVM C++ standard library with C++11 support)

2
你可以展示一下调用 Connecion 构造函数的代码吗? - Igor R.
@Igor R:我有另一个服务器类,我在main()中使用它,但Connection类没有被任何地方使用。它只是被声明了。 - Adrian
1
所以你收到了一个关于调用隐式删除的复制构造函数的错误,但是没有代码构造Connection对象?编译器是否提供了错误实例化的跟踪?当调用构造函数的代码将套接字作为右值引用传递而不是通过std::move转换为xvalue时,通常会出现这个问题。 - Tanner Sansbury
这是突出显示的部分:std::move(socket)。从我看到的情况来看,问题在于tcp::socket定义了移动构造函数,但没有复制构造函数,因此隐式复制构造函数被删除了。 - Adrian
1
请提供一个最小化的示例以演示问题。 我无法重现。 - Sam Miller
显示剩余3条评论
1个回答

5

明确定义BOOST_ASIO_HAS_MOVE对我没有起作用。我不得不修改/usr/include/boost/asio/detail/config.hpp。我添加了// Clang / libc++ detection并用来自以下网址的部分替换了// Support move construction and assignment on compilers known to allow it.:http://www.boost.org/doc/libs/1_55_0/boost/asio/detail/config.hpp - Alex Bitek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接