В этот пример, если я изменю этот вызов с помощью привязки:
boost::asio::async_connect(
socket_,
results.begin(),
results.end(),
std::bind(
&session::on_connect,
shared_from_this(),
std::placeholders::_1));
К этому:
auto self = shared_from_this();
boost::asio::async_connect(
socket_,
results.begin(),
results.end(),
[self](boost::system::error_code ec) {
self->on_connect(ec);
});
Я получаю ошибку утверждения:
boost/boost/asio/impl/connect.hpp:761: error: static_assert failed "IteratorConnectHandler type requirements not met"
BOOST_ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Там есть комментарий:
// If you get an error on the following line it means that your handler does
// not meet the documented type requirements for a IteratorConnectHandler.
У меня лично не предпочитаю связывать, и хотелось бы поменять на лямбду. Я делаю это неправильно или это небольшая ошибка в boost::beast?
Кстати, переход на лямбду для on_resolve работает нормально.





Количество параметров вашей лямбды не соответствует сигнатуре обработчика, по ссылке асинхронное_соединение обработчики принимают error_code и подключенная конечная точка - в вашем случае он отсутствует.
Исправить:
auto self = shared_from_this();
boost::asio::async_connect(
socket_,
results.begin(),
results.end(),
[self](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator) {
^^^
self->on_connect(ec);
});
Да, вы правы, в этом случае можно использовать auto, если OP использует хотя бы C++14. Но для предоставления более самодокументированного кода полное имя может быть лучшим выбором.
Возможно, вы могли бы заменить
boost::asio::ip::tcp::resolver::iteratorнаauto, если вам не нужно писать или использовать его.