C++11 如何使用boost::aio::async\u连接lambda

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) {

我想确定如何使用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) {
    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