Простая передача строки по значению и ее перемещение - это одновременно чисто и эффективно.
void Client::connect(const std::string& hostname, const std::string& port, std::string string) {
auto socket_ = std::make_shared<net::ip::tcp::socket>(_io_context);
net::ip::tcp::resolver resolver_(_io_context);
auto endpoints_ = resolver_.resolve(hostname, port);
net::async_connect(*socket_, endpoints_, [socket_, string{std::move(string)}](sys::error_code ec, net::ip::tcp::endpoint) mutable {
if(!ec) {
std::make_shared<Session>(std::move(*socket_), std::move(string))->start();
}
});
}
Session::Session(net::ip::tcp::socket socket, std::string string)
: _socket(std::move(socket)), _string(std::move(string)) {
}
Обратите особое внимание на синтаксис в захвате лямбда, который позволяет перемещать объект в лямбда.