Я пытаюсь выучить современный C ++ и использую Boost.Asio для работы в сети.Я написал класс соединения TCP, который использует асинхронные операции Asio.В настоящее время это мой метод чтения данных из сокета:
template<class T>
inline auto connection<T>::read(size_t length) -> void
{
auto handler = [&](const boost::system::error_code& error, size_t bytes_transferred) {
if (error == boost::asio::error::eof or error == boost::asio::error::connection_reset) {
close();
} else {
on_read(bytes_transferred);
}
};
socket.async_read_some(boost::asio::buffer(read_buffer, length), handler);
}
Здесь я объявил обработчик чтения отдельно с помощью auto, потому что я думаю, что он выглядит более читабельным, чем лямбда на месте, т.е.
template<class T>
inline auto connection<T>::read(size_t length) -> void
{
socket.async_read_some(boost::asio::buffer(read_buffer, length), [&](const boost::system::error_code& error, size_t bytes_transferred) {
if (error == boost::asio::error::eof or error == boost::asio::error::connection_reset) {
close();
} else {
on_read(bytes_transferred);
}
});
}
Однако я столкнулся с ошибкой сегментации с первой версией, и я считаю, что это потому, что лямбда-обработчик теряется, когда метод выходит из области видимости.Затем я попытался переместить обработчик с помощью команды std :: move
socket.async_read_some(boost::asio::buffer(read_buffer, length), std::move(handler));
, которая, кажется, исправляет ошибку сегмента.
Теперь мой вопрос: есть ли какие-либо проблемы с производительностью или другие проблемы с использованием первой версии (с std :: move) и на месте?Какой из них вы считаете лучшей практикой?