移动构造函数不使用 boost::asio::ip::tcp::socket 调用



我认为在下面的代码中应该可以工作,但它会产生编译错误:

error C2248: 'boost::asio::basic_io_object<SocketService,true>::basic_io_object' : cannot access private member declared in class 'boost::asio::basic_io_object<SocketService,true>'

似乎没有隐式调用移动构造函数。

#include <thread>
#include <boost/asio.hpp>
void Func(boost::asio::ip::tcp::socket sock) {}
int main()
{
    boost::asio::io_service service;
    boost::asio::ip::tcp::socket sock(service);
    std::thread(Func, std::move(sock)).detach(); // error C2248
    //Func(std::move(sock)); // OK
    return 0;
}

我也试图按照这个问题中的建议定义BOOST_ASIO_HAS_MOVE但没有用。

有什么解决方法吗?

试验了VS2013更新3和提升1.56.0。

这是编译器的一个已知错误。 错误票证提到这已在VS 2015 RTM中修复。

作为解决方法,请考虑创建填充程序来移动套接字。 下面是一个演示此方法的小示例:

#include <memory>
#include <thread>
#include <boost/asio.hpp>
void Func(boost::asio::ip::tcp::socket) {}
int main()
{
  boost::asio::io_service io_service;
  auto socket = std::make_shared<boost::asio::ip::tcp::socket>(
      std::ref(io_service));
  // Use a shim to move the socket to Func.
  std::thread func_thread([socket]() {
    return Func(std::move(*socket));
  });
  socket.reset();
  // Guarantee the io_service remains alive until after
  // its I/O objects have been destroyed.
  func_thread.join();
}

此外,请注意,某种形式的同步需要使io_service保持活动状态,直到关联的 I/O 对象销毁之后。

最新更新