Я думаю, что в следующем коде должны работать, но он генерирует ошибку компиляции:Move конструктор не вызывается с усилением :: ASIO :: IP :: ТСР :: сокет
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 как предложено в this question, но это не сработало.
Есть ли обходной путь для этого?
Экспериментировано с обновлением VS2013 3 и повышением 1.56.0.
Проблема заключается в том, что 'std :: thread' хранит параметры внутри, что означает, что когда функция потока вызывается, аргумент передается * по значению *. –
Извините, если мой ответ не на месте, но я не уверен на 100%, к чему вы пытаетесь добраться. Я написал свой ответ на основе «Я думаю, что этот код должен работать», а затем продолжил объяснять, почему он этого не делает и как он должен. Если ваш вопрос не о создании действующей программы с использованием boost :: asio, а скорее о семантике перемещения и о том, как они применили бы какую-то абстрактную концепцию, чтобы сделать поток, владеющий чем-то, пожалуйста, уточните. –
@TechnikEmpire Извините за двусмысленность. Как вы сказали, мое намерение было связано с изменением семантики перемещения, когда я хочу переместить принадлежность сокета к Func через std :: thread, а не об использовании boost :: asio. – akarin64