C++ 未使用boost::asio::ip::tcp::socket调用移动构造函数

C++ 未使用boost::asio::ip::tcp::socket调用移动构造函数,c++,c++11,boost,boost-asio,move-constructor,C++,C++11,Boost,Boost Asio,Move Constructor,我认为在以下代码中应该可以工作,但它会生成编译错误: 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>' 错误C2248:'boost::asio::basic\u

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

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>'
错误C2248:'boost::asio::basic\u io\u object::basic\u io\u object':无法访问在类'boost::asio::basic\u io\u object'中声明的私有成员
似乎没有隐式调用move构造函数

#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;
}
#包括
#包括
void Func(boost::asio::ip::tcp::socket sock){}
int main()
{
boost::asio::io_服务;
boost::asio::ip::tcp::socketsock(服务);
std::thread(Func,std::move(sock)).detach();//错误C2248
//Func(std::move(sock));//确定
返回0;
}
我还试图按照中的建议定义BOOST\u ASIO\u HAS\u MOVE,但没有成功

有什么解决办法吗


使用VS2013更新3和boost 1.56.0进行了试验。

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

作为解决方案,考虑创建一个垫片来移动套接字。以下是这种方法的一个小例子:

#包括
#包括
#包括
void Func(boost::asio::ip::tcp::socket){}
int main()
{
boost::asio::io_服务io_服务;
自动套接字=标准::使共享(
标准::参考(io_服务);
//使用垫片将插座移动到Func。
std::thread func_thread([socket](){
返回函数(std::move(*socket));
});
socket.reset();
//确保io_服务在之后保持活动状态
//其I/O对象已被销毁。
func_thread.join();
}

另外,请注意,某种形式的同步需要保持
io\u服务
处于活动状态,直到相关的I/O对象被销毁。

问题在于
std::thread
在内部存储参数,这意味着当调用线程函数时,参数是按值传递的。很抱歉,如果我的答案不正确,但我不能100%确定你想得到什么。我根据“我认为这段代码应该可以工作”来写我的答案,然后继续解释为什么它不能工作以及它应该如何工作。如果您的问题不是关于使用boost::asio创建一个功能正常的程序,而是关于移动语义,以及它们如何应用一些抽象概念来处理一个线程拥有某些东西,那么请澄清。@techniquempire对于歧义,我深表歉意。正如您所说,我的意图是当我想通过std::thread将socket的所有权移动到Func时,移动语义的行为,而不是boost::asio的使用。