C++11 如何使用boost::aio::async\u连接lambda
我想确定如何使用boost::aio::async_连接lambda。 Boost版本1.68 真奇怪,我可以使用std::bind,但不能使用lambda。 如果我使用std::bind,它就会工作。 但是,当我使用lambda时,它构建失败,并表示未满足IteratorConnectionHandler类型要求 绑定版本工作正常C++11 如何使用boost::aio::async\u连接lambda,c++11,boost,lambda,boost-asio,beast-websockets,C++11,Boost,Lambda,Boost Asio,Beast Websockets,我想确定如何使用boost::aio::async_连接lambda。 Boost版本1.68 真奇怪,我可以使用std::bind,但不能使用lambda。 如果我使用std::bind,它就会工作。 但是,当我使用lambda时,它构建失败,并表示未满足IteratorConnectionHandler类型要求 绑定版本工作正常 void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
auto sp = shared_from_this();
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
std::bind(
on_connect,
std::placeholders::_1)
);
}
lambda版本不工作
void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
auto sp = shared_from_this();
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(),
results.end(),
[&, sp](boost::system::error_code ec) {
if (ec) {
return;
}
ws->next_layer().async_handshake(boost::asio::ssl::stream_base::client,
[&, sp](boost::system::error_code ec1) {
handShake(ec);
});
}
);
}
那么如何在这里使用lambda呢?您使用一对迭代器进行调用,因此您的lambda应该满足以下要求。作为第二个参数,必须传递连接的端点
为了与引用保持一致,您还应该修复绑定版本。on_connect还应将迭代器作为第二个参数
您当前的绑定版本可以编译并工作,但当async_connect启动的异步操作完成时,由bind创建的functor将被调用,并且只包含错误代码,您无法访问端点。您可以修改bind,使其在不带任何参数的情况下进行连接
void on_connect(){}
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(), results.end(), std::bind(on_connect)); // compiles fine
这也会编译,但当调用处理程序时,既不能访问错误代码,也不能访问端点。是的,这有点奇怪,当使用bind时,并没有出现编译器错误,这表明处理程序的要求并没有得到满足。我不知道lambda和bind之间的分歧来自何处。请发布完整的错误消息。
void on_connect(){}
boost::asio::async_connect(ws->next_layer().next_layer(),
results.begin(), results.end(), std::bind(on_connect)); // compiles fine