Я пытаюсь адаптировать один из примеров boost::asio для использования библиотек С++ 11/TR1, где это возможно. Исходный код выглядит так:
void start_accept()
{
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
}
Если я заменю boost::bind
на std::bind
следующим образом:
void start_accept()
{
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->socket(),
std::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error ) );
// std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) );
}
Я получаю большое сообщение об ошибке, заканчивающееся на:
/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
Я использую gcc версии 4.4 с версией boost 1.47.
Я ожидал, что boost::bind и std::bind будут взаимозаменяемыми.
[=](const boost::system::error_code& error){ /*do code here or...*/ this->handle_accept(...)}
. Лично я вообще перестал использовать привязку и просто пишу ее как лямбда, независимо от того, вызывает ли лямбда функцию или делает что-то встроенное. Моя мысль такова: зачем использовать библиотечную функцию, когда есть языковая функция, которая делает то же самое? Я знаю, что это был не твой вопрос, просто мои 0,02 доллара. - person David   schedule 27.01.2012