2023-10-24 21:59:30 -04:00
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > Movable I/O Objects< / title >
< link rel = "stylesheet" href = "../../../boostbook.css" type = "text/css" >
< meta name = "generator" content = "DocBook XSL Stylesheets V1.75.2" >
< link rel = "home" href = "../../../index.html" title = "Asio" >
< link rel = "up" href = "../cpp2011.html" title = "C++ 2011 Support" >
< link rel = "prev" href = "system_error.html" title = "System Errors and Error Codes" >
< link rel = "next" href = "move_handlers.html" title = "Movable Handlers" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< / head >
< body bgcolor = "white" text = "black" link = "#0000FF" vlink = "#840084" alink = "#0000FF" >
< table cellpadding = "2" width = "100%" > < tr > < td valign = "top" > < img alt = "asio C++ library" width = "250" height = "60" src = "../../../asio.png" > < / td > < / tr > < / table >
< hr >
< div class = "spirit-nav" >
< a accesskey = "p" href = "system_error.html" > < img src = "../../../prev.png" alt = "Prev" > < / a > < a accesskey = "u" href = "../cpp2011.html" > < img src = "../../../up.png" alt = "Up" > < / a > < a accesskey = "h" href = "../../../index.html" > < img src = "../../../home.png" alt = "Home" > < / a > < a accesskey = "n" href = "move_handlers.html" > < img src = "../../../next.png" alt = "Next" > < / a >
< / div >
< div class = "section" >
< div class = "titlepage" > < div > < div > < h4 class = "title" >
< a name = "asio.overview.cpp2011.move_objects" > < / a > < a class = "link" href = "move_objects.html" title = "Movable I/O Objects" > Movable I/O Objects< / a >
< / h4 > < / div > < / div > < / div >
< p >
When move support is available (via rvalue references), Asio allows move
construction and assignment of sockets, serial ports, POSIX descriptors
and Windows handles.
< / p >
< p >
Move support allows you to write code like:
< / p >
< pre class = "programlisting" > < span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "identifier" > make_socket< / span > < span class = "special" > (< / span > < span class = "identifier" > io_context< / span > < span class = "special" > & < / span > < span class = "identifier" > i< / span > < span class = "special" > )< / span >
< span class = "special" > {< / span >
< span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "identifier" > s< / span > < span class = "special" > (< / span > < span class = "identifier" > i< / span > < span class = "special" > );< / span >
< span class = "special" > ...< / span >
< span class = "identifier" > std< / span > < span class = "special" > ::< / span > < span class = "identifier" > move< / span > < span class = "special" > (< / span > < span class = "identifier" > s< / span > < span class = "special" > );< / span >
< span class = "special" > }< / span >
< / pre >
< p >
or:
< / p >
< pre class = "programlisting" > < span class = "keyword" > class< / span > < span class = "identifier" > connection< / span > < span class = "special" > :< / span > < span class = "keyword" > public< / span > < span class = "identifier" > enable_shared_from_this< / span > < span class = "special" > < < / span > < span class = "identifier" > connection< / span > < span class = "special" > > < / span >
< span class = "special" > {< / span >
< span class = "keyword" > private< / span > < span class = "special" > :< / span >
2023-10-25 13:08:15 -04:00
< span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "identifier" > local_socket< / span > < span class = "special" > ;< / span >
2023-10-24 21:59:30 -04:00
< span class = "special" > ...< / span >
< span class = "keyword" > public< / span > < span class = "special" > :< / span >
2023-10-25 13:08:15 -04:00
< span class = "identifier" > connection< / span > < span class = "special" > (< / span > < span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "special" > & & < / span > < span class = "identifier" > s< / span > < span class = "special" > )< / span > < span class = "special" > :< / span > < span class = "identifier" > local_socket< / span > < span class = "special" > (< / span > < span class = "identifier" > std< / span > < span class = "special" > ::< / span > < span class = "identifier" > move< / span > < span class = "special" > (< / span > < span class = "identifier" > s< / span > < span class = "special" > ))< / span > < span class = "special" > {}< / span >
2023-10-24 21:59:30 -04:00
< span class = "special" > ...< / span >
< span class = "special" > };< / span >
< span class = "special" > ...< / span >
< span class = "keyword" > class< / span > < span class = "identifier" > server< / span >
< span class = "special" > {< / span >
< span class = "keyword" > private< / span > < span class = "special" > :< / span >
< span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > acceptor< / span > < span class = "identifier" > acceptor_< / span > < span class = "special" > ;< / span >
< span class = "special" > ...< / span >
< span class = "keyword" > void< / span > < span class = "identifier" > handle_accept< / span > < span class = "special" > (< / span > < span class = "identifier" > error_code< / span > < span class = "identifier" > ec< / span > < span class = "special" > ,< / span > < span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "identifier" > socket< / span > < span class = "special" > )< / span >
< span class = "special" > {< / span >
< span class = "keyword" > if< / span > < span class = "special" > (!< / span > < span class = "identifier" > ec< / span > < span class = "special" > )< / span >
< span class = "identifier" > std< / span > < span class = "special" > ::< / span > < span class = "identifier" > make_shared< / span > < span class = "special" > < < / span > < span class = "identifier" > connection< / span > < span class = "special" > > (< / span > < span class = "identifier" > std< / span > < span class = "special" > ::< / span > < span class = "identifier" > move< / span > < span class = "special" > (< / span > < span class = "identifier" > socket< / span > < span class = "special" > ))-> < / span > < span class = "identifier" > go< / span > < span class = "special" > ();< / span >
< span class = "identifier" > acceptor_< / span > < span class = "special" > .< / span > < span class = "identifier" > async_accept< / span > < span class = "special" > (...);< / span >
< span class = "special" > }< / span >
< span class = "special" > ...< / span >
< span class = "special" > };< / span >
< / pre >
< p >
as well as:
< / p >
< pre class = "programlisting" > < span class = "identifier" > std< / span > < span class = "special" > ::< / span > < span class = "identifier" > vector< / span > < span class = "special" > < < / span > < span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "special" > > < / span > < span class = "identifier" > sockets< / span > < span class = "special" > ;< / span >
< span class = "identifier" > sockets< / span > < span class = "special" > .< / span > < span class = "identifier" > push_back< / span > < span class = "special" > (< / span > < span class = "identifier" > tcp< / span > < span class = "special" > ::< / span > < span class = "identifier" > socket< / span > < span class = "special" > (...));< / span >
< / pre >
< p >
A word of warning: There is nothing stopping you from moving these objects
while there are pending asynchronous operations, but it is unlikely to
be a good idea to do so. In particular, composed operations like < a class = "link" href = "../../reference/async_read.html" title = "async_read" > async_read()< / a > store a reference
to the stream object. Moving during the composed operation means that the
composed operation may attempt to access a moved-from object.
< / p >
< p >
Move support is automatically enabled for < code class = "literal" > g++< / code > 4.5 and
later, when the < code class = "literal" > -std=c++0x< / code > or < code class = "literal" > -std=gnu++0x< / code >
compiler options are used. It may be disabled by defining < code class = "computeroutput" > < span class = "identifier" > ASIO_DISABLE_MOVE< / span > < / code > , or explicitly enabled
for other compilers by defining < code class = "computeroutput" > < span class = "identifier" > ASIO_HAS_MOVE< / span > < / code > .
Note that these macros also affect the availability of < a class = "link" href = "move_handlers.html" title = "Movable Handlers" > movable
handlers< / a > .
< / p >
< / div >
< div class = "copyright-footer" > Copyright © 2003-2023 Christopher M. Kohlhoff< p >
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at < a href = "http://www.boost.org/LICENSE_1_0.txt" target = "_top" > http://www.boost.org/LICENSE_1_0.txt< / a > )
< / p >
< / div >
< hr >
< div class = "spirit-nav" >
< a accesskey = "p" href = "system_error.html" > < img src = "../../../prev.png" alt = "Prev" > < / a > < a accesskey = "u" href = "../cpp2011.html" > < img src = "../../../up.png" alt = "Up" > < / a > < a accesskey = "h" href = "../../../index.html" > < img src = "../../../home.png" alt = "Home" > < / a > < a accesskey = "n" href = "move_handlers.html" > < img src = "../../../next.png" alt = "Next" > < / a >
< / div >
< / body >
< / html >