Opened 9 years ago
Closed 9 years ago
#9000 closed Feature Requests (fixed)
asio::buffered_stream and family missing rvalue-move support
| Reported by: | Owned by: | chris_kohlhoff | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | asio |
| Version: | Boost 1.54.0 | Severity: | Optimization |
| Keywords: | rvalue references | Cc: |
Description
The classes asio::buffered_read_stream and asio::buffered_write_stream are missing support for rvalue-move for the handler arguments. I can't say I'm truly an expert but for example, I believe that the function definition for buffered_read_stream::async_read_some should look like this:
template <typename MutableBufferSequence, typename ReadHandler>
void async_read_some(const MutableBufferSequence& buffers,
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
{
if (boost::asio::buffer_size(buffers) == 0)
{
get_io_service().post(detail::bind_handler(
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler), boost::system::error_code(), 0));
}
else if (storage_.empty())
{
async_fill(read_some_handler<MutableBufferSequence, ReadHandler>(
get_io_service(), storage_, buffers,
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler)));
}
else
{
std::size_t length = copy(buffers);
get_io_service().post(detail::bind_handler(
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler), boost::system::error_code(), length));
}
}
Note that classes like asio::basic_stream_socket all use BOOST_ASIO_MOVE_ARG and BOOST_ASIO_MOVE_CAST for their treatment of handlers.
If I am incorrect please advise me so I can correct my own code because this is the model I am following.
Change History (2)
comment:1 by , 9 years ago
comment:2 by , 9 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.

Let me also add that the use of detail::bind_handler is obsolete, at least in 1.54. It would be preferable to write:
Furthermore, the return value of calling the functor returned by [b]io_service::wrapb should be returned, as it could be a BOOST_ASIO_INITFN_RESULT_TYPE:
But amending asio::buffered_*_stream to support future returns is the subject of another ticket...