Я хотел бы начать поток с классом, который содержит не подлежащие копированию члены.Для связи с потоком я хотел бы создать общий указатель из объекта, прежде чем переместить его в поток.
Делает ли конструктор перемещения недействительным общий указатель?Если так, то каков элегантный способ сделать это на c ++?Одним из решений было бы обернуть MessageClient в общий указатель, но это взломало конструктор перемещения.
class MessageClient : public std::enable_shared_from_this<MessageClient> {
private:
boost::asio::io_context io_context;
void send() {
// code
}
void operator() () {
// code
}
};
int main () {
MessageClient client;
auto pclient = client.shared_from_this();
std::thread thread(std::move(client));
pclient->send(); // terminate called after throwing an instance of 'std::bad_weak_ptr'
// what(): bad_weak_ptr
// Aborted (core dumped)
thread.join();
}
EDIT
Я получил свой ответ.Теперь я понимаю, что неправильно использовал enable_shared_from_this
, но реальный ответ заключается в том, что нет способа решить проблему, которая не включает в себя перенос объекта в другой объект, такой как умный указатель или лямбда-функция (которая заключает в себеобъект в функтор).Лично я нашел второе решение проще, поэтому я выбрал его.
MessageClient client;
std::thread thread([&client](){client.run();});
client.send();
EDIT2
Я нашел более очевидное решение.Если я создаю ссылку на объект, мне не нужно ее переносить:
MessageClient client;
std::thread thread(std::ref(client));
client.send();