未使用 boost::asio::ip::tcp::socket 调用移动构造函数
Move constructor is not called with 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;
}
我也尝试按照 this question 中的建议定义 BOOST_ASIO_HAS_MOVE,但没有成功。
有什么解决方法吗?
使用 VS2013 update 3 和 boost 1.56.0 进行了实验。
这是编译器的一个已知错误。 bug ticket 提到这已在 VS 2015 RTM 中修复。
作为解决方法,请考虑创建垫片来移动套接字。这是一个小例子 demonstrating 这种方法:
#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 对象被销毁。
我认为下面的代码应该可以工作,但会产生编译错误:
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;
}
我也尝试按照 this question 中的建议定义 BOOST_ASIO_HAS_MOVE,但没有成功。
有什么解决方法吗?
使用 VS2013 update 3 和 boost 1.56.0 进行了实验。
这是编译器的一个已知错误。 bug ticket 提到这已在 VS 2015 RTM 中修复。
作为解决方法,请考虑创建垫片来移动套接字。这是一个小例子 demonstrating 这种方法:
#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 对象被销毁。