<html><head>
<style>
body { font-family: "Book Antiqua", "Times New Roman", "Times", serif; padding: 2em; }
.programlisting, .computeroutput, .literal { font-family: "Consolas", monospace; font-size: 90%; }
blockquote pre.programlisting { margin-left: 1em; padding-left: 1em; }
div.table { text-align: center; }
.sidebar { background-color: #e0e0e0; font-style: italic; }
p { text-align: justify; }
p.tablecaption { font-weight: bold; text-align: center; }
p.title { font-weight: bold; text-align: center; }
table { margin: auto; border: 1px solid gray; border-collapse: collapse; }
th { border: 1px solid gray; padding: 0.5em; }
td { border: 1px solid gray; padding: 0.5em; }
h1, h2, h3, h4, h5, div.titlepage { page-break-after: avoid; }
dl { margin-top: 0px; margin-bottom: 0px; }
</style>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"><title>Networking Library Proposal (Revision 2)</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<pre>Doc. no:  N4243 
Date:     2014-10-13
Revises:  N2175
Reply-To: Christopher Kohlhoff &lt;chris@kohlhoff.com&gt;
</pre>
<div class="chapter" title="Networking Library Proposal (Revision 2)"><div class="titlepage"><div><div><h2 class="title"><a name="network"></a>Networking Library Proposal (Revision 2)</h2></div></div></div><div class="section" title="1.&#160;Introduction"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.introduction"></a>1.&#160;Introduction</h2></div></div></div><p>
      In the June 2014 committee meeting in Rapperswil, LEWG requested that Boost.Asio-based
      N2175 <span class="emphasis"><em>Networking Library Proposal for TR2 (Revision 1)</em></span>
      be updated for C++14 and brought forward as a proposed Networking Technical
      Specification. This document is that revision. As well as updating the proposal
      for C++14, it incorporates improvements to Asio that are based on the widespread
      field experience accumulated since 2007.
    </p><p>
      The <a href="http://www.boost.org/libs/asio" target="_top">Boost.Asio</a> library,
      from which this proposal is derived, has been deployed in numerous systems,
      from large (including internet-facing HTTP servers, instant messaging gateways
      and financial markets applications) to small (mobile phones and embedded systems).
      The Asio library supports, or has been ported to, many operating systems including
      Linux, Mac OS X, Windows (native), Windows Runtime, Solaris, FreeBSD, NetBSD,
      OpenBSD, HP-UX, Tru64, AIX, iOS, Android, WinCE, Symbian, vxWorks and QNX Neutrino.
    </p></div><div class="section" title="2.&#160;Reference implementation"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.reference_implementation"></a>2.&#160;Reference implementation</h2></div></div></div><p>
      An almost complete implementation of the proposal text may be found in a variant
      of Asio that stands alone from Boost. This variant is available at <span class="emphasis"><em><a href="https://github.com/chriskohlhoff/asio/tree/master" target="_top">https://github.com/chriskohlhoff/asio/tree/master</a></em></span>.
    </p></div><div class="section" title="3.&#160;Library examples"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.library_examples"></a>3.&#160;Library examples</h2></div></div></div><p>
      Unfamiliar readers are encouraged to look to the <a href="http://www.boost.org/libs/asio" target="_top">Boost.Asio</a>
      documentation and examples for a more complete picture of the use of the libary.
    </p><p>
      However, to give some idea of the flavour of the proposed library, consider
      the following sample code. This is part of a server program that echoes the
      characters it receives back to the client in upper case.
    </p><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
<span class="keyword">void</span> <span class="identifier">uppercase</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">loc</span><span class="special">(</span><span class="string">""</span><span class="special">);</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">begin</span><span class="special">;</span> <span class="identifier">iter</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">iter</span><span class="special">)</span>
    <span class="special">*</span><span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">toupper</span><span class="special">(*</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">loc</span><span class="special">);</span>
<span class="special">}</span>

<span class="keyword">void</span> <span class="identifier">sync_connection</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span><span class="special">&amp;</span> <span class="identifier">socket</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">try</span>
  <span class="special">{</span>
    <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">buffer_space</span><span class="special">(</span><span class="number">1024</span><span class="special">);</span>
    <span class="keyword">for</span> <span class="special">(;;)</span>
    <span class="special">{</span>
      <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</span> <span class="special">=</span> <span class="identifier">socket</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">));</span>
      <span class="identifier">uppercase</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">buffer_space</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">length</span><span class="special">);</span>
      <span class="identifier">write</span><span class="special">(</span><span class="identifier">socket</span><span class="special">,</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">,</span> <span class="identifier">length</span><span class="special">));</span>
    <span class="special">}</span>
  <span class="special">}</span>
  <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">system_error</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span>
  <span class="special">{</span>
    <span class="comment">// ...</span>
  <span class="special">}</span>
<span class="special">}</span>
</pre><p>
      The synchronous operations used above are functions that do not return control
      to the caller until the corresponding operating system operation completes.
      In Asio-based programs their use cases typically fall into two categories:
    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
          Simple programs that do not care about timeouts, or are happy to rely on
          the timeout behaviour provided by the underlying operating system.
        </li><li class="listitem">
          Programs that require fine grained control over system calls, and are aware
          of the conditions under which synchronous operations will or will not block.
        </li></ul></div><p>
      Next, the equivalent code developed using asynchronous operations might look
      something like this:
    </p><pre class="programlisting"><span class="keyword">class</span> <span class="identifier">async_connection</span>
  <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">enable_shared_from_this</span><span class="special">&lt;</span><span class="identifier">async_connection</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="identifier">async_connection</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="identifier">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">socket</span><span class="special">))</span>
  <span class="special">{</span>
  <span class="special">}</span>

  <span class="keyword">void</span> <span class="identifier">start</span><span class="special">()</span>
  <span class="special">{</span>
    <span class="identifier">do_read</span><span class="special">();</span>
  <span class="special">}</span>

<span class="keyword">private</span><span class="special">:</span>
  <span class="keyword">void</span> <span class="identifier">do_read</span><span class="special">()</span>
  <span class="special">{</span>
    <span class="keyword">auto</span> <span class="identifier">self</span><span class="special">(</span><span class="identifier">shared_from_this</span><span class="special">());</span>
    <span class="identifier">socket_</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space_</span><span class="special">),</span>
        <span class="special">[</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">self</span><span class="special">](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</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="special">{</span>
            <span class="identifier">uppercase</span><span class="special">(</span><span class="identifier">buffer_space_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">buffer_space_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">length</span><span class="special">);</span>
            <span class="identifier">do_write</span><span class="special">(</span><span class="identifier">length</span><span class="special">);</span>
          <span class="special">}</span>
        <span class="special">});</span>
  <span class="special">}</span>

  <span class="keyword">void</span> <span class="identifier">do_write</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</span><span class="special">)</span>
  <span class="special">{</span>
    <span class="keyword">auto</span> <span class="identifier">self</span><span class="special">(</span><span class="identifier">shared_from_this</span><span class="special">());</span>
    <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">socket_</span><span class="special">,</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space_</span><span class="special">,</span> <span class="identifier">length</span><span class="special">),</span>
        <span class="special">[</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">self</span><span class="special">](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="comment">/*length*/</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="special">{</span>
            <span class="identifier">do_read</span><span class="special">();</span>
          <span class="special">}</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">socket_</span><span class="special">;</span>
  <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">buffer_space_</span><span class="special">{</span><span class="number">1024</span><span class="special">};</span>
<span class="special">};</span>
</pre><p>
      Asynchronous operations do not block the caller, but instead involve the delivery
      of a notification to the program when the corresponding operating system operation
      completes. Most non-trivial Asio-based programs will make use of asynchronous
      operations.
    </p><p>
      While the code may appear more complex due to the inverted flow of control,
      it allows a knowledgeable programmer to write code that will scale to a great
      many concurrent connections. However, this proposal uses the asynchronous model
      described in [<a class="link" href="#ref-N4045">N4045</a>]. This is an extensible
      model that allows the asynchronous operations to support a variety of composition
      and notification mechanisms, and these mechanisms may alleviate this complexity.
      This includes futures:
    </p><pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">&gt;</span> <span class="identifier">fut</span> <span class="special">=</span>
  <span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">),</span> <span class="identifier">use_future</span><span class="special">);</span>

<span class="comment">// ...</span>

<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</span> <span class="special">=</span> <span class="identifier">fut</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
</pre><p>
      and, through library extensions, coroutines:
    </p><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">coro_connection</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span><span class="special">&amp;</span> <span class="identifier">socket</span><span class="special">,</span> <span class="identifier">yield_context</span> <span class="identifier">yield</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">try</span>
  <span class="special">{</span>
    <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">buffer_space</span><span class="special">(</span><span class="number">1024</span><span class="special">);</span>
    <span class="keyword">for</span> <span class="special">(;;)</span>
    <span class="special">{</span>
      <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</span> <span class="special">=</span> <span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">),</span> <span class="identifier">yield</span><span class="special">);</span>
      <span class="identifier">uppercase</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">buffer_space</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">length</span><span class="special">);</span>
      <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">socket</span><span class="special">,</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer_space</span><span class="special">,</span> <span class="identifier">length</span><span class="special">),</span> <span class="identifier">yield</span><span class="special">);</span>
    <span class="special">}</span>
  <span class="special">}</span>
  <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">system_error</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span>
  <span class="special">{</span>
    <span class="comment">// ...</span>
  <span class="special">}</span>
<span class="special">}</span>
</pre><p>
      Finally, for many applications, networking is not a core feature, nor is it
      seen as a core competency of the application&#8217;s programmers. To cater to these
      use cases, the proposal provides a high-level interface to TCP sockets that
      is designed around the familiar C++ I/O streams framework.
    </p><p>
      Using the library in this way is as easy as opening a stream object with the
      remote host&#8217;s details:
    </p><pre class="programlisting"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">iostream</span> <span class="identifier">s</span><span class="special">(</span><span class="string">"www.boost.org"</span><span class="special">,</span> <span class="string">"http"</span><span class="special">);</span>
</pre><p>
      Once connected, you send and receive any data as needed. In this case you send
      a request:
    </p><pre class="programlisting"><span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="string">"GET / HTTP/1.0\r\n"</span><span class="special">;</span>
<span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="string">"Host: www.boost.org\r\n"</span><span class="special">;</span>
<span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="string">"Accept: */*\r\n"</span><span class="special">;</span>
<span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="string">"Connection: close\r\n\r\n"</span><span class="special">;</span>
</pre><p>
      Then receive and process the response:
    </p><pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">header</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">getline</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">header</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="identifier">header</span> <span class="special">!=</span> <span class="string">"\r"</span><span class="special">)</span>
  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">header</span> <span class="special">&lt;&lt;</span> <span class="string">"\n"</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">rdbuf</span><span class="special">();</span>
</pre><p>
      You can set a timeout to detect unresponsive connections:
    </p><pre class="programlisting"><span class="identifier">s</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">60</span><span class="special">));</span>
</pre><p>
      And, if at any time there is an error, the <code class="computeroutput"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">iostream</span></code>
      class&#8217;s <code class="computeroutput"><span class="identifier">error</span><span class="special">()</span></code>
      member function may be used to obtain an <code class="computeroutput"><span class="identifier">error_code</span></code>
      that identifies the reason for failure:
    </p><pre class="programlisting"><span class="keyword">if</span> <span class="special">(!</span><span class="identifier">s</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Unable to connect: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">error</span><span class="special">().</span><span class="identifier">message</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="string">"\n"</span><span class="special">;</span>
  <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
<span class="special">}</span>
</pre></div><div class="section" title="4.&#160;Scope"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.scope"></a>4.&#160;Scope</h2></div></div></div><p>
      Problem areas addressed by this proposal include:
    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
          Networking using TCP and UDP, including support for multicast.
        </li><li class="listitem">
          Client and server applications.
        </li><li class="listitem">
          Scalability to handle many concurrent connections.
        </li><li class="listitem">
          Protocol independence between IPv4 and IPv6.
        </li><li class="listitem">
          Name resolution (i.e. DNS).
        </li><li class="listitem">
          Timers.
        </li></ul></div><p>
      Features that are considered outside the scope of this proposal include:
    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
          Protocol implementations such as HTTP, SMTP or FTP.
        </li><li class="listitem">
          Encryption (e.g. SSL, TLS).
        </li><li class="listitem">
          Operating system specific demultiplexing APIs.
        </li><li class="listitem">
          Support for realtime environments.
        </li><li class="listitem">
          QoS-enabled sockets.
        </li><li class="listitem">
          Other TCP/IP protocols such as ICMP.
        </li><li class="listitem">
          Functions and classes for enumerating network interfaces.
        </li></ul></div></div><div class="section" title="5.&#160;Target audience"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.target_audience"></a>5.&#160;Target audience</h2></div></div></div><p>
      The bulk of the library interface is intended for use by developers with at
      least some understanding of networking concepts (or a willingness to learn).
      A high level iostreams interface supports simple use cases and permits novices
      to develop network code without needing to get into too much depth.
    </p></div><div class="section" title="6.&#160;Related work"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.related_work"></a>6.&#160;Related work</h2></div></div></div><p>
      The interface is based on the BSD sockets API, which is widely implemented
      and supported by extensive literature. It is also used as the basis of networking
      APIs in other languages (e.g. Java). Unsafe practices of the BSD sockets API,
      e.g. lack of compile-time type safety, are not included.
    </p><p>
      Asynchronous support is derived from the Proactor design pattern as implemented
      by the ADAPTIVE Communication Environment [<a class="link" href="#ref-ACE">ACE</a>],
      and is influenced by the design of the Symbian C++ sockets API [<a class="link" href="#ref-SYMBIAN">SYMBIAN</a>],
      which supports synchronous and asynchronous operations side-by-side. The Microsoft
      .NET socket classes [<a class="link" href="#ref-MS-NET">MS-NET</a>] and the Extended
      Sockets API [<a class="link" href="#ref-ES-API">ES-API</a>] developed by The Open
      Group support similar styles of network programming.
    </p></div><div class="section" title="7.&#160;Impact on the standard"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.impact_on_the_standard"></a>7.&#160;Impact on the standard</h2></div></div></div><p>
      This is a pure library proposal. It does not add any new language features,
      nor does it alter any existing standard library headers. It makes additions
      to experimental headers that may also be modified by other Technical Specifications.
    </p><p>
      This library can be implemented using compilers that conform to the C++14 standard.
      An implementation of this library requires operating system-specific functions
      that lie outside the C++14 standard.
    </p></div><div class="section" title="8.&#160;Relationship to other proposals"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.relationship_to_other_proposals"></a>8.&#160;Relationship to other proposals</h2></div></div></div><p>
      The asynchronous operations defined in this proposal use the asynchronous model
      described in [<a class="link" href="#ref-N4045">N4045</a>]. With the extensible
      asynchronous model presented in that paper, the user has the ability to select
      an asynchronous approach that is appropriate to each use case. With these library
      foundations, a single extensible asynchronous model can support a variety of
      composition methods, including:
    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
          Callbacks, where minimal runtime penalty is desirable.
        </li><li class="listitem">
          Futures, and not just std::future but also future classes supplied by other
          libraries.
        </li><li class="listitem">
          Coroutines or resumable functions, without adding new keywords to the language.
        </li></ul></div><p>
      To facilitate the coordination of asynchronous operations in multithreaded
      programs, the asynchronous model also utilises the executors design described
      in [<a class="link" href="#ref-N4045">N4046</a>].
    </p><p>
      As executors and the extensible asynchronous model are a prerequisite for the
      networking library, the proposed text below incorporates a complete specification
      of these facilities.
    </p></div><div class="section" title="9.&#160;Proposed text"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.proposed_text"></a>9.&#160;Proposed text</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="#definitions.definitions">9.1. Definitions</a></span></dt><dd><dl><dt><span class="section"><a href="#definitions.host_byte_order">9.1.1. host byte order</a></span></dt><dt><span class="section"><a href="#definitions.network_byte_order">9.1.2. network byte order</a></span></dt><dt><span class="section"><a href="#definitions.synchronous_operation">9.1.3. synchronous operation</a></span></dt><dt><span class="section"><a href="#definitions.asynchronous_operation">9.1.4. asynchronous operation</a></span></dt></dl></dd><dt><span class="section"><a href="#error_reporting.error_reporting">9.2. Error reporting</a></span></dt><dd><dl><dt><span class="section"><a href="#error_reporting.synchronous_operations">9.2.1. Synchronous operations</a></span></dt><dt><span class="section"><a href="#error_reporting.asynchronous_operations">9.2.2. Asynchronous operations</a></span></dt><dt><span class="section"><a href="#error_reporting.error_conditions">9.2.3. Error conditions</a></span></dt></dl></dd><dt><span class="section"><a href="#network.async">9.3. Asynchronous model</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_type_traits___synopsis">9.3.1. Header <code class="literal">&lt;experimental/type_traits&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#headers.header____experimental_memory___synopsis">9.3.2. Header <code class="literal">&lt;experimental/memory&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#headers.header____experimental_executor___synopsis">9.3.3. Header <code class="literal">&lt;experimental/executor&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#headers.header____experimental_strand___synopsis">9.3.4. Header <code class="literal">&lt;experimental/strand&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#headers.header____experimental_future___synopsis">9.3.5. Header <code class="literal">&lt;experimental/future&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.async_requirements">9.3.6. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.asynchronous_operations">9.3.6.1. Requirements on asynchronous operations</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.completion_tokens_and_handlers">9.3.6.1.1. Completion tokens and handlers</a></span></dt><dt><span class="section"><a href="#requirements.automatic_deduction_of_initiating_function_return_type">9.3.6.1.2. Automatic deduction of initiating function return type</a></span></dt><dt><span class="section"><a href="#requirements.production_of_initiating_function_return_value">9.3.6.1.3. Production of initiating function return value</a></span></dt><dt><span class="section"><a href="#requirements.lifetime_of_initiating_function_arguments">9.3.6.1.4. Lifetime of initiating function arguments</a></span></dt><dt><span class="section"><a href="#requirements.i_o_executor">9.3.6.1.5. I/O executor</a></span></dt><dt><span class="section"><a href="#requirements.handler_executor">9.3.6.1.6. Handler executor</a></span></dt><dt><span class="section"><a href="#requirements.outstanding_work">9.3.6.1.7. Outstanding work</a></span></dt><dt><span class="section"><a href="#requirements.allocation_of_intermediate_storage">9.3.6.1.8. Allocation of intermediate storage</a></span></dt><dt><span class="section"><a href="#requirements.execution_of_handler_on_completion_of_asynchronous_operation">9.3.6.1.9. Execution of handler on completion of asynchronous operation</a></span></dt></dl></dd><dt><span class="section"><a href="#requirements.executor">9.3.6.2. Executor requirements</a></span></dt><dt><span class="section"><a href="#requirements.service">9.3.6.3. Service requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.handler_type">9.3.7. Class template <code class="literal">handler_type</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__handler_type__members">9.3.7.1. <code class="literal">handler_type</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.async_result">9.3.8. Class template <code class="literal">async_result</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__async_result__members">9.3.8.1. <code class="literal">async_result</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.async_completion">9.3.9. Class template <code class="literal">async_completion</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__async_completion__members">9.3.9.1. <code class="literal">async_completion</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.associated_allocator">9.3.10. Class template <code class="literal">associated_allocator</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__associated_allocator__members">9.3.10.1. <code class="literal">associated_allocator</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.get_associated_allocator">9.3.11. Function <code class="literal">get_associated_allocator</code></a></span></dt><dt><span class="section"><a href="#classes.execution_context">9.3.12. Class <code class="literal">execution_context</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__execution_context__constructor">9.3.12.1. <code class="literal">execution_context</code> constructor</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__destructor">9.3.12.2. <code class="literal">execution_context</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__operations">9.3.12.3. <code class="literal">execution_context</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__protected_operations">9.3.12.4. <code class="literal">execution_context</code> protected operations</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__globals">9.3.12.5. <code class="literal">execution_context</code> globals</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.execution_context__service">9.3.13. Class <code class="literal">execution_context::service</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__execution_context__service__constructors">9.3.13.1. <code class="literal">execution_context::service</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__service__observers">9.3.13.2. <code class="literal">execution_context::service</code> observers</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__service__operations">9.3.13.3. <code class="literal">execution_context::service</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.is_executor">9.3.14. Class template <code class="literal">is_executor</code></a></span></dt><dt><span class="section"><a href="#classes.executor_arg_t">9.3.15. Executor argument tag</a></span></dt><dt><span class="section"><a href="#classes.uses_executor">9.3.16. <code class="literal">uses_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__uses_executor__trait">9.3.16.1. <code class="literal">uses_executor</code> trait</a></span></dt><dt><span class="section"><a href="#classes.uses_executor_construction">9.3.16.2. uses-executor construction</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.associated_executor">9.3.17. Class template <code class="literal">associated_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__associated_executor__members">9.3.17.1. <code class="literal">associated_executor</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.get_associated_executor">9.3.18. Function <code class="literal">get_associated_executor</code></a></span></dt><dt><span class="section"><a href="#classes.executor_wrapper">9.3.19. Class template <code class="literal">executor_wrapper</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor_wrapper__constructors">9.3.19.1. <code class="literal">executor_wrapper</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__executor_wrapper__access">9.3.19.2. <code class="literal">executor_wrapper</code> access</a></span></dt><dt><span class="section"><a href="#classes.__executor_wrapper__invocation">9.3.19.3. <code class="literal">executor_wrapper</code> invocation</a></span></dt><dt><span class="section"><a href="#classes.class_template_specialization___async_result_">9.3.19.4. Class template specialization <code class="literal">async_result</code></a></span></dt><dt><span class="section"><a href="#classes.class_template_specialization___associated_allocator_">9.3.19.5. Class template specialization <code class="literal">associated_allocator</code></a></span></dt><dt><span class="section"><a href="#classes.class_template_specialization___associated_executor_">9.3.19.6. Class template specialization <code class="literal">associated_executor</code></a></span></dt></dl></dd><dt><span class="section"><a href="#functions.wrap">9.3.20. Function <code class="literal">wrap</code></a></span></dt><dt><span class="section"><a href="#classes.executor_work">9.3.21. Class template <code class="literal">executor_work</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor_work__constructors">9.3.21.1. <code class="literal">executor_work</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__executor_work__destructor">9.3.21.2. <code class="literal">executor_work</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__executor_work__observers">9.3.21.3. <code class="literal">executor_work</code> observers</a></span></dt><dt><span class="section"><a href="#classes.__executor_work__modifiers">9.3.21.4. <code class="literal">executor_work</code> modifiers</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.make_work">9.3.22. Function <code class="literal">make_work</code></a></span></dt><dt><span class="section"><a href="#classes.system_executor">9.3.23. Class <code class="literal">system_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__system_executor__operations">9.3.23.1. <code class="literal">system_executor</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__system_executor__comparisons">9.3.23.2. <code class="literal">system_executor</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.bad_executor">9.3.24. Class <code class="literal">bad_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__bad_executor__constructor">9.3.24.1. <code class="literal">bad_executor</code> constructor</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.executor">9.3.25. Class <code class="literal">executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor__constructors">9.3.25.1. <code class="literal">executor</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__executor__assignment">9.3.25.2. <code class="literal">executor</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__executor__destructor">9.3.25.3. <code class="literal">executor</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__executor__modifiers">9.3.25.4. <code class="literal">executor</code> modifiers</a></span></dt><dt><span class="section"><a href="#classes.__executor__operations">9.3.25.5. <code class="literal">executor</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__executor__capacity">9.3.25.6. <code class="literal">executor</code> capacity</a></span></dt><dt><span class="section"><a href="#classes.__executor__target_access">9.3.25.7. <code class="literal">executor</code> target access</a></span></dt><dt><span class="section"><a href="#classes.__executor__comparisons">9.3.25.8. <code class="literal">executor</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.__executor__specialized_algorithms">9.3.25.9. <code class="literal">executor</code> specialized algorithms</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.dispatch">9.3.26. Function <code class="literal">dispatch</code></a></span></dt><dt><span class="section"><a href="#functions.post">9.3.27. Function <code class="literal">post</code></a></span></dt><dt><span class="section"><a href="#functions.defer">9.3.28. Function <code class="literal">defer</code></a></span></dt><dt><span class="section"><a href="#classes.strand">9.3.29. Class template <code class="literal">strand</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__strand__constructors">9.3.29.1. <code class="literal">strand</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__strand__assignment">9.3.29.2. <code class="literal">strand</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__strand__destructor">9.3.29.3. <code class="literal">strand</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__strand__operations">9.3.29.4. <code class="literal">strand</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__strand__comparisons">9.3.29.5. <code class="literal">strand</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.use_future_t">9.3.30. Class template <code class="literal">use_future_t</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__use_future_t__constructors">9.3.30.1. <code class="literal">use_future_t</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__use_future_t__members">9.3.30.2. <code class="literal">use_future_t</code> members</a></span></dt><dt><span class="section"><a href="#classes.use_future_t_traits">9.3.30.3. <code class="literal">use_future_t</code> traits</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.async_result_packaged_task">9.3.31. Class template specialization <code class="literal">async_result</code> for
        <code class="literal">packaged_task</code></a></span></dt><dt><span class="section"><a href="#classes.packaged_handler">9.3.32. Class template <code class="literal">packaged_handler</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__packaged_handler__constructors">9.3.32.1. <code class="literal">packaged_handler</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__packaged_handler__operations">9.3.32.2. <code class="literal">packaged_handler</code> operations</a></span></dt><dt><span class="section"><a href="#classes.async_result_packaged_handler">9.3.32.3. Class template specialization <code class="literal">async_result</code></a></span></dt></dl></dd><dt><span class="section"><a href="#classes.packaged_token">9.3.33. Class template <code class="literal">packaged_token</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__packaged_token__constructors">9.3.33.1. <code class="literal">packaged_token</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__packaged_token__operations">9.3.33.2. <code class="literal">packaged_token</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.package">9.3.34. Function <code class="literal">package</code></a></span></dt></dl></dd><dt><span class="section"><a href="#network.basic_io_services">9.4. Basic I/O services</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_io_service___synopsis">9.4.1. Header <code class="literal">&lt;experimental/io_service&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#classes.io_service">9.4.2. Class <code class="literal">io_service</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__io_service__constructors_destructor">9.4.2.1. <code class="literal">io_service</code> constructors/destructor</a></span></dt><dt><span class="section"><a href="#classes.__io_service__members">9.4.2.2. <code class="literal">io_service</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.io_service__executor_type">9.4.3. Class <code class="literal">io_service::executor_type</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__io_service__executor_type__constructors">9.4.3.1. <code class="literal">io_service::executor_type</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__io_service__executor_type__assignment">9.4.3.2. <code class="literal">io_service::executor_type</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__executor_type__operations">9.4.3.3. <code class="literal">executor_type</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__executor_type__comparisons">9.4.3.4. <code class="literal">executor_type</code> comparisons</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#network.timers">9.5. Timers</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_timer___synopsis">9.5.1. Header <code class="literal">&lt;experimental/timer&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.timers_requirements">9.5.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.wait_traits">9.5.2.1. Wait traits requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.wait_traits">9.5.3. Class template <code class="literal">wait_traits</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.class_template___wait_traits__members">9.5.3.1. Class template <code class="literal">wait_traits</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_waitable_timer">9.5.4. Class template <code class="literal">basic_waitable_timer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_waitable_timer__constructors">9.5.4.1. <code class="literal">basic_waitable_timer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__destructor">9.5.4.2. <code class="literal">basic_waitable_timer</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__assignment">9.5.4.3. <code class="literal">basic_waitable_timer</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__operations">9.5.4.4. <code class="literal">basic_waitable_timer</code> operations</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#network.buffers">9.6. Buffers</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_buffer___synopsis">9.6.1. Header <code class="literal">&lt;experimental/buffer&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.buffers_requirements">9.6.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.convertible_to_mutable_buffer">9.6.2.1. Convertible to mutable buffer requirements</a></span></dt><dt><span class="section"><a href="#requirements.mutable_buffers">9.6.2.2. Mutable buffer sequence requirements</a></span></dt><dt><span class="section"><a href="#requirements.convertible_to_const_buffer">9.6.2.3. Convertible to const buffer requirements</a></span></dt><dt><span class="section"><a href="#requirements.const_buffers">9.6.2.4. Constant buffer sequence requirements</a></span></dt><dt><span class="section"><a href="#requirements.dynamic_buffers">9.6.2.5. Dynamic buffer sequence requirements</a></span></dt><dt><span class="section"><a href="#requirements.synchronous_read_operations">9.6.2.6. Requirements on synchronous read operations</a></span></dt><dt><span class="section"><a href="#requirements.asynchronous_read_operations">9.6.2.7. Requirements on asynchronous read operations</a></span></dt><dt><span class="section"><a href="#requirements.synchronous_write_operations">9.6.2.8. Requirements on synchronous write operations</a></span></dt><dt><span class="section"><a href="#requirements.asynchronous_write_operations">9.6.2.9. Requirements on asynchronous write operations</a></span></dt><dt><span class="section"><a href="#requirements.sync_read_stream">9.6.2.10. Buffer-oriented synchronous read stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.async_read_stream">9.6.2.11. Buffer-oriented asynchronous read stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.sync_write_stream">9.6.2.12. Buffer-oriented synchronous write stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.async_write_stream">9.6.2.13. Buffer-oriented asynchronous write stream requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.mutable_buffer">9.6.3. Class <code class="literal">mutable_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__mutable_buffer__constructors">9.6.3.1. <code class="literal">mutable_buffer</code> constructors</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.const_buffer">9.6.4. Class <code class="literal">const_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__const_buffer__constructors">9.6.4.1. <code class="literal">const_buffer</code> constructors</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.mutable_buffers_1">9.6.5. Class <code class="literal">mutable_buffers_1</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__mutable_buffers_1__constructors">9.6.5.1. <code class="literal">mutable_buffers_1</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__mutable_buffers_1__members">9.6.5.2. <code class="literal">mutable_buffers_1</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.const_buffers_1">9.6.6. Class <code class="literal">const_buffers_1</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__const_buffers_1__constructors">9.6.6.1. <code class="literal">const_buffers_1</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__const_buffers_1__members">9.6.6.2. <code class="literal">const_buffers_1</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.buffer_type_traits">9.6.7. Buffer type traits</a></span></dt><dt><span class="section"><a href="#functions.buffer_cast">9.6.8. Function <code class="literal">buffer_cast</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_size">9.6.9. Function <code class="literal">buffer_size</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_copy">9.6.10. Function <code class="literal">buffer_copy</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_arithmetic">9.6.11. Buffer arithmetic</a></span></dt><dt><span class="section"><a href="#functions.buffer">9.6.12. Buffer creation functions</a></span></dt><dt><span class="section"><a href="#classes.dynamic_vector_buffer">9.6.13. Class template <code class="literal">dynamic_vector_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__dynamic_vector_buffer__constructors">9.6.13.1. <code class="literal">dynamic_vector_buffer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__dynamic_vector_buffer__members">9.6.13.2. <code class="literal">dynamic_vector_buffer</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.dynamic_string_buffer">9.6.14. Class template <code class="literal">dynamic_string_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__dynamic_string_buffer__constructors">9.6.14.1. <code class="literal">dynamic_string_buffer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__dynamic_string_buffer__members">9.6.14.2. <code class="literal">dynamic_string_buffer</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.dynamic_buffer">9.6.15. Dynamic buffer creation functions</a></span></dt><dt><span class="section"><a href="#classes.transfer_all">9.6.16. Class <code class="literal">transfer_all</code></a></span></dt><dt><span class="section"><a href="#classes.transfer_at_least">9.6.17. Class <code class="literal">transfer_at_least</code></a></span></dt><dt><span class="section"><a href="#classes.transfer_exactly">9.6.18. Class <code class="literal">transfer_exactly</code></a></span></dt><dt><span class="section"><a href="#functions.read">9.6.19. Synchronous read operations</a></span></dt><dt><span class="section"><a href="#functions.async_read">9.6.20. Asynchronous read operations</a></span></dt><dt><span class="section"><a href="#functions.write">9.6.21. Synchronous write operations</a></span></dt><dt><span class="section"><a href="#functions.async_write">9.6.22. Asynchronous write operations</a></span></dt><dt><span class="section"><a href="#functions.read_until">9.6.23. Synchronous delimited read operations</a></span></dt><dt><span class="section"><a href="#functions.async_read_until">9.6.24. Asynchronous delimited read operations</a></span></dt></dl></dd><dt><span class="section"><a href="#network.sockets">9.7. Sockets</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_socket___synopsis">9.7.1. Header <code class="literal">&lt;experimental/socket&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.sockets_requirements">9.7.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.native_handles">9.7.2.1. Native handles</a></span></dt><dt><span class="section"><a href="#requirements.extensibility">9.7.2.2. Extensibility</a></span></dt><dt><span class="section"><a href="#requirements.endpoint">9.7.2.3. Endpoint requirements</a></span></dt><dt><span class="section"><a href="#requirements.protocol">9.7.2.4. Protocol requirements</a></span></dt><dt><span class="section"><a href="#requirements.gettable_socket_option">9.7.2.5. Gettable socket option requirements</a></span></dt><dt><span class="section"><a href="#requirements.settable_socket_option">9.7.2.6. Settable socket option requirements</a></span></dt><dt><span class="section"><a href="#requirements.io_control_command">9.7.2.7. I/O control command requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.socket_errc">9.7.3. Error codes</a></span></dt><dt><span class="section"><a href="#classes.socket_base">9.7.4. Class <code class="literal">socket_base</code></a></span></dt><dt><span class="section"><a href="#classes.socket_base__bool_socket_options">9.7.5. Boolean socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.boolean_socket_option_constructors">9.7.5.1. Boolean socket option constructors</a></span></dt><dt><span class="section"><a href="#classes.boolean_socket_option_members">9.7.5.2. Boolean socket option members</a></span></dt><dt><span class="section"><a href="#classes.boolean_socket_option_members__extensible_implementations_">9.7.5.3. Boolean socket option members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.socket_base__int_socket_options">9.7.6. Integral socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.integral_socket_option_constructors">9.7.6.1. Integral socket option constructors</a></span></dt><dt><span class="section"><a href="#classes.integral_socket_option_members">9.7.6.2. Integral socket option members</a></span></dt><dt><span class="section"><a href="#classes.integral_socket_option_members__extensible_implementations_">9.7.6.3. Integral socket option members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.socket_base__linger">9.7.7. Class <code class="literal">socket_base::linger</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__socket_base__linger__constructors">9.7.7.1. <code class="literal">socket_base::linger</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__socket_base__linger__members">9.7.7.2. <code class="literal">socket_base::linger</code> members</a></span></dt><dt><span class="section"><a href="#classes.__socket_base__linger__members__extensible_implementations_">9.7.7.3. <code class="literal">socket_base::linger</code> members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_socket">9.7.8. Class template <code class="literal">basic_socket</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_socket__constructors">9.7.8.1. <code class="literal">basic_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__destructor">9.7.8.2. <code class="literal">basic_socket</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__assignment">9.7.8.3. <code class="literal">basic_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__operations">9.7.8.4. <code class="literal">basic_socket</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_datagram_socket">9.7.9. Class template <code class="literal">basic_datagram_socket</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_datagram_socket__constructors">9.7.9.1. <code class="literal">basic_datagram_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_datagram_socket__assignment">9.7.9.2. <code class="literal">basic_datagram_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_datagram_socket__operations">9.7.9.3. <code class="literal">basic_datagram_socket</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_stream_socket">9.7.10. Class template <code class="literal">basic_stream_socket</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_stream_socket__constructors">9.7.10.1. <code class="literal">basic_stream_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_stream_socket__assignment">9.7.10.2. <code class="literal">basic_stream_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_stream_socket__operations">9.7.10.3. <code class="literal">basic_stream_socket</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_socket_acceptor">9.7.11. Class template <code class="literal">basic_socket_acceptor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_socket_acceptor__constructors">9.7.11.1. <code class="literal">basic_socket_acceptor</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__destructor">9.7.11.2. <code class="literal">basic_socket_acceptor</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__assignment">9.7.11.3. <code class="literal">basic_socket_acceptor</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__operations">9.7.11.4. <code class="literal">basic_socket_acceptor</code> operations</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#network.socket_streams">9.8. Socket streams</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.basic_socket_streambuf">9.8.1. Class template <code class="literal">basic_socket_streambuf</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_socket_streambuf__constructors">9.8.1.1. <code class="literal">basic_socket_streambuf</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_streambuf__members">9.8.1.2. <code class="literal">basic_socket_streambuf</code> members</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_streambuf__overridden_virtual_functions">9.8.1.3. <code class="literal">basic_socket_streambuf</code> overridden virtual functions</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_socket_iostream">9.8.2. Class template <code class="literal">basic_socket_iostream</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_socket_iostream__constructors">9.8.2.1. <code class="literal">basic_socket_iostream</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_iostream__members">9.8.2.2. <code class="literal">basic_socket_iostream</code> members</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#functions.connect">9.9. Synchronous connect operations</a></span></dt><dt><span class="section"><a href="#functions.async_connect">9.10. Asynchronous connect operations</a></span></dt><dt><span class="section"><a href="#network.internet_protocol">9.11. Internet protocol</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_internet___synopsis">9.11.1. Header <code class="literal">&lt;experimental/internet&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.internet_protocol_requirements">9.11.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.internet_protocol">9.11.2.1. Internet protocol requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__resolver_errc">9.11.3. Error codes</a></span></dt><dt><span class="section"><a href="#classes.ip__address">9.11.4. Class <code class="literal">ip::address</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address__constructors">9.11.4.1. <code class="literal">ip::address</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__assignment">9.11.4.2. <code class="literal">ip::address</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__members">9.11.4.3. <code class="literal">ip::address</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__address__comparisons">9.11.4.4. <code class="literal">ip::address</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address__creation">9.11.4.5. <code class="literal">ip::address</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address__io">9.11.4.6. <code class="literal">ip::address</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_v4">9.11.5. Class <code class="literal">ip::address_v4</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.struct___ip__address_v4__bytes_type_">9.11.5.1. Struct <code class="literal">ip::address_v4::bytes_type</code></a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__constructors">9.11.5.2. <code class="literal">ip::address_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__assignment">9.11.5.3. <code class="literal">ip::address_v4</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__members">9.11.5.4. <code class="literal">ip::address_v4</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__static_members">9.11.5.5. <code class="literal">ip::address_v4</code> static members</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__comparisons">9.11.5.6. <code class="literal">ip::address_v4</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__creation">9.11.5.7. <code class="literal">ip::address_v4</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__io">9.11.5.8. <code class="literal">ip::address_v4</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_v6">9.11.6. Class <code class="literal">ip::address_v6</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.struct___ip__address_v6__bytes_type_">9.11.6.1. Struct <code class="literal">ip::address_v6::bytes_type</code></a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__constructors">9.11.6.2. <code class="literal">ip::address_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__assignment">9.11.6.3. <code class="literal">ip::address_v6</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__members">9.11.6.4. <code class="literal">ip::address_v6</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__static_members">9.11.6.5. <code class="literal">ip::address_v6</code> static members</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__comparisons">9.11.6.6. <code class="literal">ip::address_v6</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__creation">9.11.6.7. <code class="literal">ip::address_v6</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__io">9.11.6.8. <code class="literal">ip::address_v6</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__bad_address_cast">9.11.7. Class <code class="literal">ip::bad_address_cast</code></a></span></dt><dt><span class="section"><a href="#functions.ip__address_cast">9.11.8. Function <code class="literal">ip::address_cast</code></a></span></dt><dt><span class="section"><a href="#classes.hash">9.11.9. Hash support</a></span></dt><dt><span class="section"><a href="#classes.ip__address_iterator_v4">9.11.10. Class template <code class="literal">ip::address_iterator_v4</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address_iterator_v4__constructors">9.11.10.1. <code class="literal">ip::address_iterator_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_iterator_v4__members">9.11.10.2. <code class="literal">ip::address_iterator_v4</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_iterator_v6">9.11.11. Class template <code class="literal">ip::address_iterator_v6</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address_iterator_v6__constructors">9.11.11.1. <code class="literal">ip::address_iterator_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_iterator_v6__members">9.11.11.2. <code class="literal">ip::address_iterator_v6</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_range_v4">9.11.12. Class template <code class="literal">ip::address_range_v4</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address_range_v4__constructors">9.11.12.1. <code class="literal">ip::address_range_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_range_v4__members">9.11.12.2. <code class="literal">ip::address_range_v4</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_range_v6">9.11.13. Class template <code class="literal">ip::address_range_v6</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address_range_v6__constructors">9.11.13.1. <code class="literal">ip::address_range_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_range_v6__members">9.11.13.2. <code class="literal">ip::address_range_v6</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__network_v4">9.11.14. Class template <code class="literal">ip::network_v4</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__network_v4__constructors">9.11.14.1. <code class="literal">ip::network_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__network_v4__members">9.11.14.2. <code class="literal">ip::network_v4</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__comparisons">9.11.14.3. <code class="literal">ip::network_v4</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__creation">9.11.14.4. <code class="literal">ip::network_v4</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__io">9.11.14.5. <code class="literal">ip::network_v4</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__network_v6">9.11.15. Class template <code class="literal">ip::network_v6</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__network_v6__constructors">9.11.15.1. <code class="literal">ip::network_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__network_v6__members">9.11.15.2. <code class="literal">ip::network_v6</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__comparisons">9.11.15.3. <code class="literal">ip::network_v6</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__creation">9.11.15.4. <code class="literal">ip::network_v6</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__io">9.11.15.5. <code class="literal">ip::network_v6</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__basic_endpoint">9.11.16. Class template <code class="literal">ip::basic_endpoint</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__basic_endpoint__constructors">9.11.16.1. <code class="literal">ip::basic_endpoint</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__members">9.11.16.2. <code class="literal">ip::basic_endpoint</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__comparisons">9.11.16.3. <code class="literal">ip::basic_endpoint</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__i_o">9.11.16.4. <code class="literal">ip::basic_endpoint</code> I/O</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__members__extensible_implementations_">9.11.16.5. <code class="literal">ip::basic_endpoint</code> members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__resolver_query_base">9.11.17. Class <code class="literal">ip::resolver_query_base</code></a></span></dt><dt><span class="section"><a href="#classes.ip__basic_resolver_entry">9.11.18. Class template <code class="literal">ip::basic_resolver_entry</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__basic_resolver_entry__constructors">9.11.18.1. <code class="literal">ip::basic_resolver_entry</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_entry__members">9.11.18.2. <code class="literal">ip::basic_resolver_entry</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__basic_resolver_iterator">9.11.19. Class template <code class="literal">ip::basic_resolver_iterator</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__basic_resolver_iterator__constructors">9.11.19.1. <code class="literal">ip::basic_resolver_iterator</code> constructors</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__basic_resolver_query">9.11.20. Class template <code class="literal">ip::basic_resolver_query</code></a></span></dt><dt><span class="section"><a href="#classes.ip__basic_resolver">9.11.21. Class template <code class="literal">ip::basic_resolver</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__basic_resolver__constructors">9.11.21.1. <code class="literal">ip::basic_resolver</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__destructor">9.11.21.2. <code class="literal">ip::basic_resolver</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__assignment">9.11.21.3. <code class="literal">ip::basic_resolver</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__operations">9.11.21.4. <code class="literal">ip::basic_resolver</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.ip__host_name">9.11.22. Host name functions</a></span></dt><dt><span class="section"><a href="#classes.ip__tcp">9.11.23. Class <code class="literal">ip::tcp</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__tcp__comparisons">9.11.23.1. <code class="literal">ip::tcp</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__tcp__no_delay">9.11.24. Class <code class="literal">ip::tcp::no_delay</code></a></span></dt><dt><span class="section"><a href="#classes.ip__udp">9.11.25. Class <code class="literal">ip::udp</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__udp__comparisons">9.11.25.1. <code class="literal">ip::udp</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__v6_only">9.11.26. Class <code class="literal">ip::v6_only</code></a></span></dt><dt><span class="section"><a href="#classes.ip__unicast__hops">9.11.27. Class <code class="literal">ip::unicast::hops</code></a></span></dt><dt><span class="section"><a href="#classes.ip__multicast__group_socket_options">9.11.28. Multicast group management socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.multicast_group_management_socket_option_constructors">9.11.28.1. Multicast group management socket option constructors</a></span></dt><dt><span class="section"><a href="#classes.multicast_group_management_socket_option_members__extensible_implementations_">9.11.28.2. Multicast group management socket option members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__multicast__outbound_interface">9.11.29. Class <code class="literal">ip::multicast::outbound_interface</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__multicast__outbound_interface__constructors">9.11.29.1. <code class="literal">ip::multicast::outbound_interface</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__multicast__outbound_interface__members__extensible_implementations_">9.11.29.2. <code class="literal">ip::multicast::outbound_interface</code> members (extensible
          implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__multicast__hops">9.11.30. Class <code class="literal">ip::multicast::hops</code></a></span></dt><dt><span class="section"><a href="#classes.ip__multicast__enable_loopback">9.11.31. Class <code class="literal">ip::multicast::enable_loopback</code></a></span></dt></dl></dd></dl></div><div class="sidebar"><p class="title"><b></b></p><p>
      Grey-shaded italic text is commentary on the proposal. It is not to be added
      to the TS.
    </p></div><p>
      This clause describes components that C++ programs may use to perform network
      operations.
    </p><div class="sidebar"><p class="title"><b></b></p><p>
      The Draft Filesystem Technical Specification [<a class="link" href="#ref-N4099">N4099</a>]
      adds an introductory section on conformance to establish a relationship to
      <span class="emphasis"><em>POSIX</em></span> [<a class="link" href="#ref-POSIX">POSIX</a>]. This proposal
      also requires a similar relationship to define behavior "as if" implemented
      by <span class="emphasis"><em>POSIX</em></span>. It is expected that a section on conformance
      would be added here.
    </p></div><p>
      The following subclauses describe components for executors, I/O services, timers,
      buffer management, sockets, endpoint resolution, iostreams, and internet protocols,
      as summarized in the table below:
    </p><div class="table"><a name="network.proposed_text.t0"></a><p class="title"><b>Table&#160;1.&#160;Networking library summary</b></p><div class="table-contents"><table class="table" summary="Networking library summary"><colgroup><col><col></colgroup><thead><tr><th>
              <p>
                Subclause
              </p>
            </th><th>
              <p>
                Header(s)
              </p>
            </th></tr></thead><tbody><tr><td>
              <p>
                <a class="link" href="#network.async" title="9.3.&#160;Asynchronous model">Asynchronous model</a>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">&gt;</span></code><br> <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">memory</span><span class="special">&gt;</span></code><br>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">executor</span><span class="special">&gt;</span></code><br> <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">strand</span><span class="special">&gt;</span></code><br>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">future</span><span class="special">&gt;</span></code>
              </p>
            </td></tr><tr><td>
              <p>
                <a class="link" href="#network.basic_io_services" title="9.4.&#160;Basic I/O services">Basic I/O services</a>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">io_service</span><span class="special">&gt;</span></code>
              </p>
            </td></tr><tr><td>
              <p>
                <a class="link" href="#network.timers" title="9.5.&#160;Timers">Timers</a>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">timer</span><span class="special">&gt;</span></code>
              </p>
            </td></tr><tr><td>
              <p>
                <a class="link" href="#network.buffers" title="9.6.&#160;Buffers">Buffers</a>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">buffer</span><span class="special">&gt;</span></code>
              </p>
            </td></tr><tr><td>
              <p>
                <a class="link" href="#network.sockets" title="9.7.&#160;Sockets">Sockets</a><br> <a class="link" href="#network.socket_streams" title="9.8.&#160;Socket streams">Socket
                streams</a><br>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">socket</span><span class="special">&gt;</span></code>
              </p>
            </td></tr><tr><td>
              <p>
                <a class="link" href="#network.internet_protocol" title="9.11.&#160;Internet protocol">Internet protocol</a><br>
              </p>
            </td><td>
              <p>
                <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">internet</span><span class="special">&gt;</span></code>
              </p>
            </td></tr></tbody></table></div></div><br class="table-break"><p>
      Throughout this clause, the names of the template parameters are used to express
      type requirements, as listed in the table below.
    </p><div class="table"><a name="network.proposed_text.t1"></a><p class="title"><b>Table&#160;2.&#160;Template parameters and type requirements</b></p><div class="table-contents"><table class="table" summary="Template parameters and type requirements"><colgroup><col><col></colgroup><thead><tr><th>
              <p>
                template parameter name
              </p>
            </th><th>
              <p>
                type requirements
              </p>
            </th></tr></thead><tbody><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.async_read_stream" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements">buffer-oriented asynchronous
                read stream</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">AsyncWriteStream</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.async_write_stream" title="9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements">buffer-oriented asynchronous
                write stream</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant buffer sequence</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">ConvertibleToConstBuffer</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.convertible_to_const_buffer" title="9.6.2.3.&#160;Convertible to const buffer requirements">convertible
                to a constant buffer</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">ConvertibleToMutableBuffer</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.convertible_to_mutable_buffer" title="9.6.2.1.&#160;Convertible to mutable buffer requirements">convertible
                to a mutable buffer</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">DynamicBufferSequence</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic buffer sequence</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">GettableSocketOption</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.gettable_socket_option" title="9.7.2.5.&#160;Gettable socket option requirements">gettable socket
                option</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">InternetProtocol</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.internet_protocol" title="9.11.2.1.&#160;Internet protocol requirements">Internet protocol</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">IoControlCommand</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.io_control_command" title="9.7.2.7.&#160;I/O control command requirements">I/O control command</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable buffer sequence</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">Protocol</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements">protocol</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">Service</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.service" title="9.3.6.3.&#160;Service requirements">service</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">SettableSocketOption</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements">settable socket
                option</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">SyncReadStream</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.sync_read_stream" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements">buffer-oriented synchronous
                read stream</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">SyncWriteStream</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.sync_write_stream" title="9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements">buffer-oriented synchronous
                write stream</a>
              </p>
            </td></tr><tr><td>
              <p>
                <code class="computeroutput"><span class="identifier">WaitTraits</span></code>
              </p>
            </td><td>
              <p>
                <a class="link" href="#requirements.wait_traits" title="9.5.2.1.&#160;Wait traits requirements">wait traits</a>
              </p>
            </td></tr></tbody></table></div></div><br class="table-break"><div class="section" title="9.1.&#160;Definitions"><div class="titlepage"><div><div><h3 class="title"><a name="definitions.definitions"></a>9.1.&#160;Definitions</h3></div></div></div><div class="section" title="9.1.1.&#160;host byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.host_byte_order"></a>9.1.1.&#160;host byte order</h4></div></div></div><p>
          See section 1.4 of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3783.pdf" target="_top">N3783
          Network Byte Order Conversion</a>.
        </p></div><div class="section" title="9.1.2.&#160;network byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.network_byte_order"></a>9.1.2.&#160;network byte order</h4></div></div></div><p>
          See section 1.4 of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3783.pdf" target="_top">N3783
          Network Byte Order Conversion</a>.
        </p></div><div class="section" title="9.1.3.&#160;synchronous operation"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.synchronous_operation"></a>9.1.3.&#160;synchronous operation</h4></div></div></div><p>
          A synchronous operation is logically executed in the context of the initiating
          thread. Control is not returned to the initiating thread until the operation
          completes.
        </p></div><div class="section" title="9.1.4.&#160;asynchronous operation"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.asynchronous_operation"></a>9.1.4.&#160;asynchronous operation</h4></div></div></div><p>
          An asynchronous operation is logically executed in parallel to the context
          of the initiating thread. Control is returned immediately to the initiating
          thread without waiting for the operation to complete. Multiple asynchronous
          operations may be executed in parallel by a single initiating thread.
        </p></div></div><div class="section" title="9.2.&#160;Error reporting"><div class="titlepage"><div><div><h3 class="title"><a name="error_reporting.error_reporting"></a>9.2.&#160;Error reporting</h3></div></div></div><div class="section" title="9.2.1.&#160;Synchronous operations"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.synchronous_operations"></a>9.2.1.&#160;Synchronous operations</h4></div></div></div><p>
          Synchronous network library functions often provide two overloads, one
          that throws an exception to report system errors, and another that sets
          an <code class="computeroutput"><span class="identifier">error_code</span></code>.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> This supports two common use cases:<br>
          <br> &#8212; Uses where system errors are truly exceptional and indicate a serious
          failure. Throwing an exception is the most appropriate response. This is
          the preferred default for most everyday programming.<br> <br> &#8212; Uses
          where system errors are routine and do not necessarily represent failure.
          Returning an error code is the most appropriate response. This allows application
          specific error handling, including simply ignoring the error.<br> <br>
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><p>
          Functions <span class="bold"><strong>not</strong></span> having an argument of type
          <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code>
          report errors as follows, unless otherwise specified:
        </p><p>
          &#8212; When a call by the implementation to an operating system or other underlying
          API results in an error that prevents the function from meeting its specifications,
          an exception of type <code class="computeroutput"><span class="identifier">system_error</span></code>
          shall be thrown.
        </p><p>
          &#8212; Failure to allocate storage is reported by throwing an exception as described
          in the C++ standard (C++14 [res.on.exception.handling]).
        </p><p>
          &#8212; Destructors throw nothing.
        </p><p>
          Functions having an argument of type <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code> report errors as follows, unless otherwise
          specified:
        </p><p>
          &#8212; If a call by the implementation to an operating system or other underlying
          API results in an error that prevents the function from meeting its specifications,
          the <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code>
          argument is set as appropriate for the specific error. Otherwise, <code class="computeroutput"><span class="identifier">clear</span><span class="special">()</span></code>
          is called on the <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code> argument.
        </p><p>
          Where a function is specified as two overloads, with and without an argument
          of type <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code>:
        </p><pre class="programlisting"><span class="bold"><strong><span class="emphasis"><em>R f</em></span></strong></span><span class="special">(</span><span class="emphasis"><em><span class="bold"><strong>A1</strong></span></em></span> <span class="identifier">a1</span><span class="special">,</span> <span class="emphasis"><em><span class="bold"><strong>A2</strong></span></em></span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...,</span> <span class="emphasis"><em><span class="bold"><strong>AN</strong></span></em></span> <span class="identifier">aN</span><span class="special">);</span>
<span class="bold"><strong><span class="emphasis"><em>R f</em></span></strong></span><span class="special">(</span><span class="emphasis"><em><span class="bold"><strong>A1</strong></span></em></span> <span class="identifier">a1</span><span class="special">,</span> <span class="emphasis"><em><span class="bold"><strong>A2</strong></span></em></span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...,</span> <span class="emphasis"><em><span class="bold"><strong>AN</strong></span></em></span> <span class="identifier">aN</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><p>
          then, when <span class="bold"><strong><span class="emphasis"><em>R</em></span></strong></span> is non-<code class="computeroutput"><span class="keyword">void</span></code>, the effects of the first overload
          shall be as if:
        </p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="emphasis"><em><span class="bold"><strong>R</strong></span></em></span> <span class="identifier">r</span><span class="special">(</span><span class="emphasis"><em><span class="bold"><strong>f</strong></span></em></span><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">aN</span><span class="special">,</span> <span class="identifier">ec</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="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">__func__</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">r</span><span class="special">;</span>
</pre><p>
          Otherwise, when <span class="bold"><strong><span class="emphasis"><em>R</em></span></strong></span>
          is <code class="computeroutput"><span class="keyword">void</span></code>, the effects of the
          first overload shall be as if:
        </p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="emphasis"><em><span class="bold"><strong>f</strong></span></em></span><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">aN</span><span class="special">,</span> <span class="identifier">ec</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="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">__func__</span><span class="special">);</span>
</pre></div><div class="section" title="9.2.2.&#160;Asynchronous operations"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.asynchronous_operations"></a>9.2.2.&#160;Asynchronous operations</h4></div></div></div><p>
          Asynchronous network library functions are identified by having the prefix
          <code class="computeroutput"><span class="identifier">async_</span></code>. These asynchronous
          operations report errors as follows:
        </p><p>
          &#8212; If a call by the implementation to an operating system or other underlying
          API results in an error that prevents the asynchronous operation from meeting
          its specifications, the handler shall be invoked with an <code class="computeroutput"><span class="identifier">error_code</span></code> value <code class="computeroutput"><span class="identifier">ec</span></code>
          that is set as appropriate for the specific error. Otherwise, the <code class="computeroutput"><span class="identifier">error_code</span></code> value <code class="computeroutput"><span class="identifier">ec</span></code>
          is set such that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>
          is true.
        </p><p>
          &#8212; Asynchronous operations shall not fail with an error condition that indicates
          interruption by a signal [<span class="emphasis"><em>Note:</em></span> Such as <span class="emphasis"><em>POSIX</em></span>
          <code class="computeroutput"><span class="identifier">EINTR</span></code> &#8212;<span class="emphasis"><em>end note</em></span>]
          . Asynchronous operations shall not fail with any error condition associated
          with non-blocking operations [<span class="emphasis"><em>Note:</em></span> Such as <span class="emphasis"><em>POSIX</em></span>
          <code class="computeroutput"><span class="identifier">EWOULDBLOCK</span></code>, <code class="computeroutput"><span class="identifier">EAGAIN</span></code> or <code class="computeroutput"><span class="identifier">EINPROGRESS</span></code>;
          <span class="emphasis"><em>Windows</em></span> <code class="computeroutput"><span class="identifier">WSAEWOULDBLOCK</span></code>
          or <code class="computeroutput"><span class="identifier">WSAEINPROGRESS</span></code> &#8212;<span class="emphasis"><em>end
          note</em></span>] .
        </p></div><div class="section" title="9.2.3.&#160;Error conditions"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.error_conditions"></a>9.2.3.&#160;Error conditions</h4></div></div></div><p>
          Unless otherwise specified, when the behavior of a synchronous or asynchronous
          operation is defined "as if" implemented by a <span class="emphasis"><em>POSIX</em></span>
          function, the <code class="computeroutput"><span class="identifier">error_code</span></code>
          produced by the function shall meet the following requirements:
        </p><p>
          &#8212; If the failure condition is one that is listed by <span class="emphasis"><em>POSIX</em></span>
          for that function, the <code class="computeroutput"><span class="identifier">error_code</span></code>
          shall compare equal to the error's corresponding <code class="computeroutput"><span class="keyword">enum</span>
          <span class="keyword">class</span> <span class="identifier">errc</span></code>
          (C++14 [syserr]) or <a class="link" href="#classes.ip__resolver_errc" title="9.11.3.&#160;Error codes"><code class="computeroutput"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">resolver_errc</span></code></a> constant.
        </p><p>
          &#8212; Otherwise, the <code class="computeroutput"><span class="identifier">error_code</span></code>
          shall be set to an implementation-defined value that reflects the underlying
          operating system error.
        </p><p>
          [<span class="emphasis"><em>Example:</em></span> The <span class="emphasis"><em>POSIX</em></span> specification
          for <a href="http://www.opengroup.org/onlinepubs/000095399/functions/shutdown.html" target="_top"><code class="computeroutput"><span class="identifier">shutdown</span><span class="special">()</span></code></a>
          lists <code class="computeroutput"><span class="identifier">EBADF</span></code> as one of its
          possible errors. If a function that is specified "as if" implemented
          by <a href="http://www.opengroup.org/onlinepubs/000095399/functions/shutdown.html" target="_top"><code class="computeroutput"><span class="identifier">shutdown</span><span class="special">()</span></code></a>
          fails with <code class="computeroutput"><span class="identifier">EBADF</span></code> then the
          following condition holds for the <code class="computeroutput"><span class="identifier">error_code</span></code>
          value <code class="computeroutput"><span class="identifier">ec</span></code>: <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">bad_file_descriptor</span></code> &#8212;<span class="emphasis"><em>end example</em></span>]
        </p><p>
          When the description of a function contains the element <span class="emphasis"><em>Error
          conditions</em></span>, this lists conditions where the operation may fail.
          The conditions are listed, together with a suitable explanation, as <code class="computeroutput"><span class="keyword">enum</span> <span class="keyword">class</span></code>
          constants. Unless otherwise specified, this list is a subset of the failure
          conditions associated with the function.
        </p></div></div><div class="section" title="9.3.&#160;Asynchronous model"><div class="titlepage"><div><div><h3 class="title"><a name="network.async"></a>9.3.&#160;Asynchronous model</h3></div></div></div><div class="section" title="9.3.1.&#160;Header &lt;experimental/type_traits&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_type_traits___synopsis"></a>9.3.1.&#160;Header <code class="literal">&lt;experimental/type_traits&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <a class="link" href="#classes.handler_type" title="9.3.7.&#160;Class template handler_type">handler_type</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
        <span class="keyword">using</span> <span class="identifier">handler_type_t</span> <span class="special">=</span>
          <span class="keyword">typename</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span> <span class="identifier">Signature</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Handler</span><span class="special">&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.async_result" title="9.3.8.&#160;Class template async_result">async_result</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <a class="link" href="#classes.async_completion" title="9.3.9.&#160;Class template async_completion">async_completion</a><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.3.2.&#160;Header &lt;experimental/memory&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_memory___synopsis"></a>9.3.2.&#160;Header <code class="literal">&lt;experimental/memory&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
        <span class="keyword">struct</span> <a class="link" href="#classes.associated_allocator" title="9.3.10.&#160;Class template associated_allocator">associated_allocator</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
        <span class="keyword">using</span> <span class="identifier">associated_allocator_t</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>

      // <a class="link" href="#functions.get_associated_allocator" title="9.3.11.&#160;Function get_associated_allocator">get_associated_allocator</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
        <span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.3.3.&#160;Header &lt;experimental/executor&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_executor___synopsis"></a>9.3.3.&#160;Header <code class="literal">&lt;experimental/executor&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">fork_event</span> <span class="special">{</span>
        <span class="identifier">prepare</span><span class="special">,</span>
        <span class="identifier">parent</span><span class="special">,</span>
        <span class="identifier">child</span>
      <span class="special">};</span>

      <span class="keyword">class</span> <a class="link" href="#classes.execution_context" title="9.3.12.&#160;Class execution_context">execution_context</a><span class="special">;</span>

      <span class="keyword">class</span> <span class="identifier">service_already_exists</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span> <span class="identifier">use_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span>
        <span class="identifier">make_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="keyword">bool</span> <span class="identifier">has_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <a class="link" href="#classes.is_executor" title="9.3.14.&#160;Class template is_executor">is_executor</a> <span class="special">:</span> <span class="identifier">false_type</span> <span class="special">{};</span>

      <span class="keyword">struct</span> <a class="link" href="#classes.executor_arg_t" title="9.3.15.&#160;Executor argument tag">executor_arg_t</a> <span class="special">{</span> <span class="special">};</span>
      <span class="keyword">constexpr</span> <span class="identifier">executor_arg_t</span> <span class="identifier">executor_arg</span> <span class="special">=</span> <span class="identifier">executor_arg_t</span><span class="special">();</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">struct</span> <a class="link" href="#classes.uses_executor" title="9.3.16.&#160;uses_executor">uses_executor</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span> <span class="special">=</span> <span class="identifier">system_executor</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <a class="link" href="#classes.associated_executor" title="9.3.17.&#160;Class template associated_executor">associated_executor</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span> <span class="special">=</span> <span class="identifier">system_executor</span><span class="special">&gt;</span>
        <span class="keyword">using</span> <span class="identifier">associated_executor_t</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>

      // <a class="link" href="#functions.get_associated_executor" title="9.3.18.&#160;Function get_associated_executor">get_associated_executor</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
        <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
          <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
        <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
          <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">struct</span> <a class="link" href="#classes.executor_wrapper" title="9.3.19.&#160;Class template executor_wrapper">executor_wrapper</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Signature</span><span class="special">&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor1</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Executor1</span><span class="special">&gt;;</span>

      // <a class="link" href="#functions.wrap" title="9.3.20.&#160;Function wrap">wrap</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
        <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">wrap</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
        <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
          <span class="identifier">wrap</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">t</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">struct</span> <a class="link" href="#classes.executor_work" title="9.3.21.&#160;Class template executor_work">executor_work</a><span class="special">;</span>

      // <a class="link" href="#functions.make_work" title="9.3.22.&#160;Function make_work">make_work</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span>
          <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
        <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
          <span class="identifier">make_work</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
        <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span>
          <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;</span>
          <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
        <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;&gt;</span>
          <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>

      <span class="keyword">class</span> <a class="link" href="#classes.system_executor" title="9.3.23.&#160;Class system_executor">system_executor</a><span class="special">;</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;);</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;);</span>

      <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">system_executor</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

      <span class="keyword">class</span> <a class="link" href="#classes.bad_executor" title="9.3.24.&#160;Class bad_executor">bad_executor</a><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.executor" title="9.3.25.&#160;Class executor">executor</a><span class="special">;</span>

      <span class="keyword">template</span> <span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">executor</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      // <a class="link" href="#functions.dispatch" title="9.3.26.&#160;Function dispatch">dispatch</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      // <a class="link" href="#functions.post" title="9.3.27.&#160;Function post">post</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      // <a class="link" href="#functions.defer" title="9.3.28.&#160;Function defer">defer</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>

  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
    <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
      <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.3.4.&#160;Header &lt;experimental/strand&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_strand___synopsis"></a>9.3.4.&#160;Header <code class="literal">&lt;experimental/strand&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.strand" title="9.3.29.&#160;Class template strand">strand</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&gt;</span> <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.3.5.&#160;Header &lt;experimental/future&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_future___synopsis"></a>9.3.5.&#160;Header <code class="literal">&lt;experimental/future&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">future</span><span class="special">&gt;</span>

<span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.use_future_t" title="9.3.30.&#160;Class template use_future_t">use_future_t</a><span class="special">;</span>

      <span class="keyword">constexpr</span> <span class="identifier">use_future_t</span><span class="special">&lt;&gt;</span> <span class="identifier">use_future</span> <span class="special">=</span> <span class="identifier">use_future_t</span><span class="special">&lt;&gt;();</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">Allocator</span><span class="special">&gt;,</span> <span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.async_result_packaged_task" title="9.3.31.&#160;Class template specialization async_result for packaged_task">async_result&lt;packaged_task&lt;R(Args...)&gt;&gt;</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.packaged_handler" title="9.3.32.&#160;Class template packaged_handler">packaged_handler</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.packaged_token" title="9.3.33.&#160;Class template packaged_token">packaged_token</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;,</span> <span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
        <span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span> <a class="link" href="#functions.package" title="9.3.34.&#160;Function package">package</a><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">());</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.3.6.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.async_requirements"></a>9.3.6.&#160;Requirements</h4></div></div></div><div class="section" title="9.3.6.1.&#160;Requirements on asynchronous operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_operations"></a>9.3.6.1.&#160;Requirements on asynchronous operations</h5></div></div></div><p>
            In this clause, an asynchronous operation is initiated by a function
            that is named with the prefix <code class="computeroutput"><span class="identifier">async_</span></code>.
            These functions shall be known as <span class="emphasis"><em>initiating functions</em></span>.
          </p><div class="section" title="9.3.6.1.1.&#160;Completion tokens and handlers"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.completion_tokens_and_handlers"></a>9.3.6.1.1.&#160;Completion tokens and handlers</h6></div></div></div><p>
              All initiating functions in this clause:
            </p><p>
              &#8212; are function templates with template parameter <code class="computeroutput"><span class="identifier">CompletionToken</span></code>;
            </p><p>
              &#8212; accept, as the final parameter, a <span class="emphasis"><em>completion token</em></span>
              object <code class="computeroutput"><span class="identifier">token</span></code> of type
              <code class="computeroutput"><span class="identifier">CompletionToken</span></code>;
            </p><p>
              &#8212; specify a <span class="emphasis"><em>Completion signature</em></span> element that defines
              a call signature <code class="computeroutput"><span class="identifier">Signature</span></code>.
            </p><p>
              A <span class="emphasis"><em>handler</em></span> is a function object that will be invoked,
              at most once, with the result of an asynchronous operation.
            </p><p>
              An initiating function determines the type <code class="computeroutput"><span class="identifier">Handler</span></code>
              of its handler function object by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span> <span class="identifier">Signature</span><span class="special">&gt;</span></code>. The handler object <code class="computeroutput"><span class="identifier">handler</span></code> is initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p><p>
              The type <code class="computeroutput"><span class="identifier">Handler</span></code> must
              satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
              requirements (C++ Std, [moveconstructible]) and be callable with the
              specified completion signature. The <span class="emphasis"><em>Completion signature</em></span>
              elements in this clause have named parameters, and the result of an
              asynchronous operation is specified in terms of these names.
            </p></div><div class="section" title="9.3.6.1.2.&#160;Automatic deduction of initiating function return type"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.automatic_deduction_of_initiating_function_return_type"></a>9.3.6.1.2.&#160;Automatic deduction of initiating function return type</h6></div></div></div><p>
              All initiating functions in this clause are specified using automatic
              return type deduction. The function return type shall be determined
              as if by <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;::</span><span class="identifier">type</span></code>.
            </p></div><div class="section" title="9.3.6.1.3.&#160;Production of initiating function return value"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.production_of_initiating_function_return_value"></a>9.3.6.1.3.&#160;Production of initiating function return value</h6></div></div></div><p>
              All initiating functions in this clause produce their return type as
              follows:
            </p><p>
              &#8212; constructing an object <code class="computeroutput"><span class="identifier">result</span></code>
              of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>;
              and
            </p><p>
              &#8212; using <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
              as the return expression.
            </p><p>
              [<span class="emphasis"><em>Example:</em></span> Given an asynchronous operation with
              <span class="emphasis"><em>Completion signature</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">R1</span> <span class="identifier">r1</span><span class="special">,</span> <span class="identifier">R2</span> <span class="identifier">r2</span><span class="special">)</span></code>, an initiating function meeting these
              requirements may be implemented as follows:
            </p><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
<span class="keyword">auto</span> <span class="identifier">async_xyz</span><span class="special">(</span><span class="identifier">T1</span> <span class="identifier">t1</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">t2</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">void</span><span class="special">(</span><span class="identifier">R1</span> <span class="identifier">r1</span><span class="special">,</span> <span class="identifier">R2</span> <span class="identifier">r2</span><span class="special">)&gt;</span>
    <span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">));</span>

  <span class="identifier">async_result</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)&gt;</span> <span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">);</span>

  <span class="comment">// initiate the operation and cause handler to be invoked with the result</span>

  <span class="keyword">return</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
<span class="special">}</span>
</pre><p>
              For convenience, initiating functions may be implemented using the
              <code class="computeroutput"><span class="identifier">async_completion</span></code> template:
            </p><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
<span class="keyword">auto</span> <span class="identifier">async_xyz</span><span class="special">(</span><span class="identifier">T1</span> <span class="identifier">t1</span><span class="special">,</span> <span class="identifier">T2</span> <span class="identifier">t2</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">async_completion</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">void</span><span class="special">(</span><span class="identifier">R1</span> <span class="identifier">r1</span><span class="special">,</span> <span class="identifier">R2</span> <span class="identifier">r2</span><span class="special">)&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">token</span><span class="special">);</span>

  <span class="comment">// initiate the operation and cause init.handler to be invoked with the result</span>

  <span class="keyword">return</span> <span class="identifier">init</span><span class="special">.</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
<span class="special">}</span>
</pre><p>
              &#8212;<span class="emphasis"><em>end example</em></span>]
            </p></div><div class="section" title="9.3.6.1.4.&#160;Lifetime of initiating function arguments"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.lifetime_of_initiating_function_arguments"></a>9.3.6.1.4.&#160;Lifetime of initiating function arguments</h6></div></div></div><p>
              Unless otherwise specified, the lifetime of arguments to initiating
              functions shall be treated as follows:
            </p><p>
              &#8212; If the parameter is declared as a const reference, rvalue reference,
              or by-value, the implementation must not assume the validity of the
              argument after the initiating function completes. [<span class="emphasis"><em>Note:</em></span>
              In other words, the program is not required to guarantee the validity
              of the argument after the initiating function completes. &#8212;<span class="emphasis"><em>end
              note</em></span>] The implementation may make copies of the argument,
              and all copies shall be destroyed no later than immediately after invocation
              of the handler.
            </p><p>
              &#8212; If the parameter is declared as a non-const reference, const pointer
              or non-const pointer, the implementation may assume the validity of
              the argument until the handler is invoked. [<span class="emphasis"><em>Note:</em></span>
              In other words, the program must guarantee the validity of the argument
              until the handler is invoked. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></div><div class="section" title="9.3.6.1.5.&#160;I/O executor"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.i_o_executor"></a>9.3.6.1.5.&#160;I/O executor</h6></div></div></div><p>
              All asynchronous operations in this clause have an associated executor
              object satisfying <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
              Where the initiating function is a member function, the associated
              executor is that returned by the <code class="computeroutput"><span class="identifier">get_executor</span></code>
              member function on the same object. Where the initiating function is
              not a member function, the associated executor is that returned by
              the <code class="computeroutput"><span class="identifier">get_executor</span></code> member
              function of the first argument to the initiating function. Let <code class="computeroutput"><span class="identifier">Executor1</span></code> be the type of the associated
              executor, and <code class="computeroutput"><span class="identifier">ex1</span></code> be
              the associated executor object obtained as described above.
            </p></div><div class="section" title="9.3.6.1.6.&#160;Handler executor"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.handler_executor"></a>9.3.6.1.6.&#160;Handler executor</h6></div></div></div><p>
              All handler objects have an associated executor object satisfying
              <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
              The type <code class="computeroutput"><span class="identifier">Executor2</span></code>
              of the handler's associated executor shall be determined by <code class="computeroutput"><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">,</span>
              <span class="identifier">Executor1</span><span class="special">&gt;</span></code>.
              The handler's associated executor object <code class="computeroutput"><span class="identifier">ex2</span></code>
              shall be obtained by performing <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">,</span> <span class="identifier">Executor1</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">handler</span><span class="special">,</span> <span class="identifier">ex1</span><span class="special">)</span></code>.
            </p></div><div class="section" title="9.3.6.1.7.&#160;Outstanding work"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.outstanding_work"></a>9.3.6.1.7.&#160;Outstanding work</h6></div></div></div><p>
              The implementation of an asynchronous operation shall maintain an object
              <code class="computeroutput"><span class="identifier">work1</span></code> of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">Executor1</span><span class="special">&gt;</span></code>,
              initialized with <code class="computeroutput"><span class="identifier">work1</span><span class="special">(</span><span class="identifier">ex1</span><span class="special">)</span></code> and with <code class="computeroutput"><span class="identifier">work1</span><span class="special">.</span><span class="identifier">owns_work</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, until the effects of the asynchronous
              operation have been realized.
            </p><p>
              The implementation of an asynchronous operation shall maintain an object
              <code class="computeroutput"><span class="identifier">work2</span></code> of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">Executor2</span><span class="special">&gt;</span></code>,
              initialized with <code class="computeroutput"><span class="identifier">work2</span><span class="special">(</span><span class="identifier">ex2</span><span class="special">)</span></code> and with <code class="computeroutput"><span class="identifier">work2</span><span class="special">.</span><span class="identifier">owns_work</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, until <code class="computeroutput"><span class="identifier">handler</span></code>
              has been submitted for execution.
            </p></div><div class="section" title="9.3.6.1.8.&#160;Allocation of intermediate storage"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.allocation_of_intermediate_storage"></a>9.3.6.1.8.&#160;Allocation of intermediate storage</h6></div></div></div><p>
              Asynchronous operations may allocate memory. [<span class="emphasis"><em>Note:</em></span>
              Such as a data structure to store copies of the <code class="computeroutput"><span class="identifier">handler</span></code>
              object and the initiating function's arguments. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p><p>
              Let <code class="computeroutput"><span class="identifier">Alloc1</span></code> be a type,
              satisfying <code class="computeroutput"><span class="identifier">Allocator</span></code>
              requirements (C++ Std, [allocator.requirements]), that represents the
              asynchronous operation's default allocation strategy. [<span class="emphasis"><em>Note:</em></span>
              Typically <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span></code>.
              &#8212;<span class="emphasis"><em>end note</em></span>] Let <code class="computeroutput"><span class="identifier">alloc1</span></code>
              be an object of type <code class="computeroutput"><span class="identifier">Alloc1</span></code>.
            </p><p>
              All handlers have an associated allocator object satisfying <code class="computeroutput"><span class="identifier">Allocator</span></code> requirements. The type
              <code class="computeroutput"><span class="identifier">Alloc2</span></code> of the handler's
              associated allocator shall be determined by <code class="computeroutput"><span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">,</span> <span class="identifier">Alloc1</span><span class="special">&gt;</span></code>. The handler's associated allocator
              object <code class="computeroutput"><span class="identifier">alloc2</span></code> shall
              be obtained by performing <code class="computeroutput"><span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">,</span> <span class="identifier">Executor1</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">handler</span><span class="special">,</span> <span class="identifier">alloc1</span><span class="special">)</span></code>.
            </p><p>
              The asynchronous operations defined in this clause:
            </p><p>
              &#8212; May allocate memory using the handler's associated allocator.
            </p><p>
              &#8212; Shall deallocate all memory allocated using the handler's associated
              allocator prior to handler execution.
            </p><p>
              &#8212; Shall ensure that calls to the handler's associated allocator, or to
              copies of the handler's associated allocator, are not performed concurrently
              in a way that would introduce a data race.
            </p></div><div class="section" title="9.3.6.1.9.&#160;Execution of handler on completion of asynchronous operation"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.execution_of_handler_on_completion_of_asynchronous_operation"></a>9.3.6.1.9.&#160;Execution of handler on completion of asynchronous operation</h6></div></div></div><p>
              When an asynchronous operation completes, the implementation constructs
              a zero-argument function object <code class="computeroutput"><span class="identifier">bound_handler</span></code>
              to invoke <code class="computeroutput"><span class="identifier">handler</span></code> with
              results of the operation.
            </p><p>
              If an asynchonous operation completes immediately (that is, within
              the thread calling the initiating function, and before the initiating
              function returns), the handler shall be submitted for execution as
              if by performing <code class="computeroutput"><span class="identifier">ex2</span><span class="special">.</span><span class="identifier">post</span><span class="special">(</span><span class="identifier">bound_handler</span><span class="special">,</span> <span class="identifier">alloc2</span><span class="special">)</span></code>. Otherwise, the handler shall be submitted
              for execution as if by performing <code class="computeroutput"><span class="identifier">ex2</span><span class="special">.</span><span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">bound_handler</span><span class="special">,</span> <span class="identifier">alloc2</span><span class="special">)</span></code>.
            </p></div></div><div class="section" title="9.3.6.2.&#160;Executor requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.executor"></a>9.3.6.2.&#160;Executor requirements</h5></div></div></div><p>
            The library describes a standard set of requirements for <span class="emphasis"><em>executors</em></span>.
            A type meeting Executor requirements shall embody a set of rules for
            determining how submitted function objects are to be executed.
          </p><p>
            An executor type <code class="computeroutput"><span class="identifier">X</span></code> shall
            satisfy the requirements of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            (C++ Std, [copyconstructible]) types. No constructor, comparison operator,
            copy operation, move operation, swap operation, or member functions
            <code class="computeroutput"><span class="identifier">context</span></code>, <code class="computeroutput"><span class="identifier">on_work_started</span></code> and <code class="computeroutput"><span class="identifier">on_work_finished</span></code>
            on these types shall exit via an exception.
          </p><p>
            The executor copy constructor, comparison operators, and member functions
            defined in these requirements shall not introduce data races as a result
            of concurrent calls to those functions from different threads.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes an executor class, <code class="computeroutput"><span class="identifier">x</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span><span class="special">&amp;</span></code>, <code class="computeroutput"><span class="identifier">x1</span></code>
            and <code class="computeroutput"><span class="identifier">x2</span></code> denote values
            of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span></code>, <code class="computeroutput"><span class="identifier">x3</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span><span class="special">&amp;&amp;</span></code>, <code class="computeroutput"><span class="identifier">f</span></code>
            denotes a <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            (C++ Std, [moveconstructible]) function object callable with zero arguments,
            <code class="computeroutput"><span class="identifier">a</span></code> denotes a value of
            type <code class="computeroutput"><span class="identifier">A</span></code> meeting <code class="computeroutput"><span class="identifier">Allocator</span></code> requirements (C++ Std, [allocator.requirements]),
            <code class="computeroutput"><span class="identifier">t</span></code> denotes an object of
            type <code class="computeroutput"><span class="identifier">T</span></code>, and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.async.async_requirements.executor.t0"></a><p class="title"><b>Table&#160;3.&#160;Executor requirements</b></p><div class="table-contents"><table class="table" summary="Executor requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">x1</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Shall not exit via an exception.<br> <br> post: <code class="computeroutput"><span class="identifier">u</span> <span class="special">==</span>
                      <span class="identifier">x1</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">x3</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Shall not exit via an exception.<br> <br> post: <code class="computeroutput"><span class="identifier">u</span></code> equals the prior value
                      of <code class="computeroutput"><span class="identifier">x3</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span> <span class="special">==</span>
                      <span class="identifier">x2</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Shall not exit via an exception.<br> <br> Returns <code class="computeroutput"><span class="keyword">true</span></code> only if <code class="computeroutput"><span class="identifier">x1</span></code>
                      and <code class="computeroutput"><span class="identifier">x2</span></code> can
                      be interchanged with identical effects in any of the expressions
                      defined in these type requirements. [<span class="emphasis"><em>Note:</em></span>
                      <code class="computeroutput"><span class="keyword">false</span></code> does not
                      necessarily imply that the effects are not identical. &#8212;<span class="emphasis"><em>end
                      note</em></span>] <br> <br> <code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> shall be reflexive, symmetric,
                      and transitive, and shall not exit via an exception.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span> <span class="special">!=</span>
                      <span class="identifier">x2</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Shall not exit via an exception.<br> <br> Same as <code class="computeroutput"><span class="special">!(</span><span class="identifier">x1</span>
                      <span class="special">==</span> <span class="identifier">x2</span><span class="special">)</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">context</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">&amp;</span></code>, or a type that is convertible
                      to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">&amp;</span></code>.
                    </p>
                  </td><td>
                    <p>
                      Shall not exit via an exception.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Shall not exit via an exception.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">on_work_finished</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Shall not exit via an exception.<br> <br> Requires: A preceding
                      call <code class="computeroutput"><span class="identifier">x1</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>
                      where <code class="computeroutput"><span class="identifier">x</span> <span class="special">==</span>
                      <span class="identifier">x1</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">dispatch</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">f</span><span class="special">),</span><span class="identifier">a</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Effects: Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> at most once. The executor
                      may invoke <code class="computeroutput"><span class="identifier">f</span></code>
                      in the current thread, prior to returning from <code class="computeroutput"><span class="identifier">dispatch</span></code>. The call to <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">()</span></code>
                      is evaluated in the thread that called <code class="computeroutput"><span class="identifier">dispatch</span></code>.<br>
                      <br> Executor implementations are encouraged to use the supplied
                      allocator to allocate any memory required to store the function
                      object. The executor shall deallocate all memory prior to invoking
                      the function object.<br> <br> Synchronization: The invocation
                      of <code class="computeroutput"><span class="identifier">dispatch</span></code>
                      synchronizes with (C++ Std, [intro.multithread]) the invocation
                      of <code class="computeroutput"><span class="identifier">f</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">post</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">f</span><span class="special">),</span><span class="identifier">a</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Effects: Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> at most once. The executor
                      may not invoke <code class="computeroutput"><span class="identifier">f</span></code>
                      in the current thread, prior to returning from <code class="computeroutput"><span class="identifier">post</span></code>. The call to <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">()</span></code>
                      is evaluated in the thread that called <code class="computeroutput"><span class="identifier">post</span></code>.<br>
                      <br> Executor implementations are encouraged to use the supplied
                      allocator to allocate any memory required to store the function
                      object. The executor shall deallocate all memory prior to invoking
                      the function object.<br> <br> Synchronization: The invocation
                      of <code class="computeroutput"><span class="identifier">post</span></code> synchronizes
                      with (C++ Std, [intro.multithread]) the invocation of <code class="computeroutput"><span class="identifier">f</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">defer</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">f</span><span class="special">),</span><span class="identifier">a</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Effects: Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> at most once. The executor
                      may not invoke <code class="computeroutput"><span class="identifier">f</span></code>
                      in the current thread, prior to returning from <code class="computeroutput"><span class="identifier">defer</span></code>. The call to <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">()</span></code>
                      is evaluated in the thread that called <code class="computeroutput"><span class="identifier">defer</span></code>.<br>
                      <br> Executor implementations are encouraged to use the supplied
                      allocator to allocate any memory required to store the function
                      object. The executor shall deallocate all memory prior to invoking
                      the function object.<br> <br> Synchronization: The invocation
                      of <code class="computeroutput"><span class="identifier">defer</span></code> synchronizes
                      with (C++ Std, [intro.multithread]) the invocation of <code class="computeroutput"><span class="identifier">f</span></code>.<br> <br> Note: Although
                      the requirements placed on <code class="computeroutput"><span class="identifier">defer</span></code>
                      are identical to <code class="computeroutput"><span class="identifier">post</span></code>,
                      a separate function is used to convey the intention of the
                      caller that the submitted function is a continuation of the
                      current call context. The executor may use this information
                      to optimize or otherwise adjust the way in which <code class="computeroutput"><span class="identifier">f</span></code> is invoked.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.3.6.3.&#160;Service requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.service"></a>9.3.6.3.&#160;Service requirements</h5></div></div></div><p>
            A class is a service if it is publicly derived from another service,
            or if it is a class publicly derived from <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code>.
          </p><p>
            A service may contain a publicly-accessible nested typedef named <code class="computeroutput"><span class="identifier">key_type</span></code>. If the nested typedef <code class="computeroutput"><span class="identifier">key_type</span></code> exists, the service class
            shall be the same type as <code class="computeroutput"><span class="identifier">key_type</span></code>,
            or otherwise publicly and unambiguously derived from <code class="computeroutput"><span class="identifier">key_type</span></code>.
          </p><p>
            All services define a one-argument constructor that takes a reference
            to the <code class="computeroutput"><span class="identifier">execution_context</span></code>
            object that owns the service. This constructor is <span class="emphasis"><em>explicit</em></span>,
            preventing its participation in automatic conversions.
          </p><p>
            A service may provide additional constructors with two or more arguments,
            where the first argument is a reference to the <code class="computeroutput"><span class="identifier">execution_context</span></code>
            object that owns the service. [<span class="emphasis"><em>Note:</em></span> These constructors
            may be called by the <code class="computeroutput"><span class="identifier">make_service</span></code>
            function. &#8212;<span class="emphasis"><em>end note</em></span>]
          </p><p>
            [<span class="emphasis"><em>Example:</em></span> <br>
          </p><p>
</p><pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_service</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="keyword">typedef</span> <span class="identifier">my_service</span> <span class="identifier">key_type</span><span class="special">;</span>
  <span class="keyword">explicit</span> <span class="identifier">my_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
<span class="keyword">private</span><span class="special">:</span>
  <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">shutdown_service</span><span class="special">();</span>
  ...
<span class="special">};</span>
</pre><p>
          </p><p>
            &#8212;<span class="emphasis"><em>end example</em></span>]
          </p><p>
            A service's <code class="computeroutput"><span class="identifier">shutdown_service</span></code>
            member function must cause all copies of user-defined function objects
            that are held by the service to be destroyed.
          </p></div></div><div class="section" title="9.3.7.&#160;Class template handler_type"><div class="titlepage"><div><div><h4 class="title"><a name="classes.handler_type"></a>9.3.7.&#160;Class template <code class="literal">handler_type</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">handler_type</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Template parameter <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
          specifies the model used to obtain the result of the asynchronous operation.
          Template parameter <code class="computeroutput"><span class="identifier">Signature</span></code>
          is the call signature (C++ Std, [func.def]) for the handler type invoked
          on completion of the asynchronous operation.
        </p><p>
          A program may specialize this trait if the <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
          template parameter in the specialization is a user-defined type.
        </p><p>
          Specializations of <code class="computeroutput"><span class="identifier">handler_type</span></code>
          shall define a nested handler type <code class="computeroutput"><span class="identifier">type</span></code>
          that satisfies the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
          requirements, and objects of type <code class="computeroutput"><span class="identifier">type</span></code>
          shall be constructible from an lvalue or rvalue of the type specified by
          the <code class="computeroutput"><span class="identifier">CompletionToken</span></code> template
          parameter.
        </p><div class="section" title="9.3.7.1.&#160;handler_type members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__handler_type__members"></a>9.3.7.1.&#160;<code class="literal">handler_type</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Type:</em></span> <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
              if <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
              and <code class="computeroutput"><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;</span></code>
              are the same type; otherwise, <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;,</span> <span class="identifier">Signature</span><span class="special">&gt;</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.8.&#160;Class template async_result"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_result"></a>9.3.8.&#160;Class template <code class="literal">async_result</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Handler</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">async_result</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">Handler</span><span class="special">&amp;);</span>
        <span class="identifier">async_result</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">async_result</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>

        <span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Template argument <code class="computeroutput"><span class="identifier">Handler</span></code>
          is a handler type produced by <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">S</span><span class="special">&gt;</span></code>
          for some completion token type <code class="computeroutput"><span class="identifier">T</span></code>
          and call signature <code class="computeroutput"><span class="identifier">S</span></code>.
        </p><p>
          A program may specialize this template if the <code class="computeroutput"><span class="identifier">Handler</span></code>
          template parameter in the specialization is a user-defined type.
        </p><p>
          Specializations of <code class="computeroutput"><span class="identifier">async_result</span></code>
          shall satisfy the <code class="computeroutput"><span class="identifier">Destructible</span></code>
          requirements (C++ Std, [destructible]) in addition to the requirements
          in the table below. In this table, <code class="computeroutput"><span class="identifier">R</span></code>
          is a specialization of <code class="computeroutput"><span class="identifier">async_result</span></code>
          for the template parameter <code class="computeroutput"><span class="identifier">Handler</span></code>;
          <code class="computeroutput"><span class="identifier">r</span></code> is a modifiable lvalue
          of type <code class="computeroutput"><span class="identifier">R</span></code>; and <code class="computeroutput"><span class="identifier">h</span></code> is a modifiable lvalue of type <code class="computeroutput"><span class="identifier">Handler</span></code>.
        </p><div class="table"><a name="classes.proposed_text.async.async_result.t0"></a><p class="title"><b>Table&#160;4.&#160;async_result specialization requirements</b></p><div class="table-contents"><table class="table" summary="async_result specialization requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Expression
                  </p>
                </th><th>
                  <p>
                    Return type
                  </p>
                </th><th>
                  <p>
                    Note
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">R</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">void</span></code>; or a type
                    satisfying <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
                    requirements (C++ Std, [moveconstructible])
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">R</span> <span class="identifier">r</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span></code>
                  </p>
                </td><td>
                </td><td>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">r</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">R</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    The <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
                    member function shall be used only as a return expression.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><div class="section" title="9.3.8.1.&#160;async_result members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__async_result__members"></a>9.3.8.1.&#160;<code class="literal">async_result</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">Handler</span><span class="special">&amp;);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Does nothing.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Does nothing.
            </p></blockquote></div></div></div><div class="section" title="9.3.9.&#160;Class template async_completion"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_completion"></a>9.3.9.&#160;Class template <code class="literal">async_completion</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">async_completion</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span> <span class="identifier">Signature</span><span class="special">&gt;</span> <span class="identifier">handler_type</span><span class="special">;</span>

        <span class="keyword">explicit</span> <span class="identifier">async_completion</span><span class="special">(</span><span class="identifier">remove_reference_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="identifier">async_completion</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">async_completion</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">async_completion</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">async_completion</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>

        <span class="emphasis"><em>see below</em></span> <span class="identifier">handler</span><span class="special">;</span>
        <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">handler_type</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Template parameter <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
          specifies the model used to obtain the result of the asynchronous operation.
          Template parameter <code class="computeroutput"><span class="identifier">Signature</span></code>
          is the call signature (C++ Std, [func.def]) for the handler type invoked
          on completion of the asynchronous operation.
        </p><div class="section" title="9.3.9.1.&#160;async_completion members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__async_completion__members"></a>9.3.9.1.&#160;<code class="literal">async_completion</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">async_completion</span><span class="special">(</span><span class="identifier">remove_reference_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
              and <code class="computeroutput"><span class="identifier">handler_type</span></code> are
              the same type, binds <code class="computeroutput"><span class="identifier">handler</span></code>
              to <code class="computeroutput"><span class="identifier">t</span></code>; otherwise, initializes
              <code class="computeroutput"><span class="identifier">handler</span></code> with the result
              of <code class="computeroutput"><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">result</span></code>
              with <code class="computeroutput"><span class="identifier">handler</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="emphasis"><em>see below</em></span> <span class="identifier">handler</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Type:</em></span> <code class="computeroutput"><span class="identifier">handler_type</span><span class="special">&amp;</span></code> if <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
              and <code class="computeroutput"><span class="identifier">handler_type</span></code> are
              the same type; otherwise, <code class="computeroutput"><span class="identifier">handler_type</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.10.&#160;Class template associated_allocator"><div class="titlepage"><div><div><h4 class="title"><a name="classes.associated_allocator"></a>9.3.10.&#160;Class template <code class="literal">associated_allocator</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">associated_allocator</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          A program may specialize this traits type if the <code class="computeroutput"><span class="identifier">T</span></code>
          template parameter in the specialization is a user-defined type. The template
          parameter <code class="computeroutput"><span class="identifier">Alloc</span></code> shall be
          a type meeting <code class="computeroutput"><span class="identifier">Allocator</span></code>
          requirements (C++ Std, [allocator.requirements]).
        </p><p>
          Specializations of <code class="computeroutput"><span class="identifier">associated_allocator</span></code>
          shall satisfy the requirements in the table below. In this table, <code class="computeroutput"><span class="identifier">X</span></code> is a specialization of <code class="computeroutput"><span class="identifier">associated_allocator</span></code> for the template
          parameter <code class="computeroutput"><span class="identifier">T</span></code>; <code class="computeroutput"><span class="identifier">t</span></code> is a const reference to an object of
          type <code class="computeroutput"><span class="identifier">T</span></code>; and <code class="computeroutput"><span class="identifier">a</span></code> is an object of type <code class="computeroutput"><span class="identifier">Alloc</span></code>.
        </p><div class="table"><a name="classes.proposed_text.async.associated_allocator.t0"></a><p class="title"><b>Table&#160;5.&#160;associated_allocator specialization requirements</b></p><div class="table-contents"><table class="table" summary="associated_allocator specialization requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Expression
                  </p>
                </th><th>
                  <p>
                    Return type
                  </p>
                </th><th>
                  <p>
                    Note
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    A type meeting <code class="computeroutput"><span class="identifier">Allocator</span></code>
                    requirements (C++ Std, [allocator.requirements]).
                  </p>
                </td><td>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    Shall not exit via an exception.<br> Equivalent to <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span>
                    <span class="identifier">Alloc</span><span class="special">())</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span>
                    <span class="identifier">a</span><span class="special">)</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    Shall not exit via an exception.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><div class="section" title="9.3.10.1.&#160;associated_allocator members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__associated_allocator__members"></a>9.3.10.1.&#160;<code class="literal">associated_allocator</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Type:</em></span> If <code class="computeroutput"><span class="identifier">T</span></code>
              has a nested type <code class="computeroutput"><span class="identifier">allocator_type</span></code>,
              <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">allocator_type</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">Alloc</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">T</span></code>
              has a nested type <code class="computeroutput"><span class="identifier">allocator_type</span></code>,
              <code class="computeroutput"><span class="identifier">t</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">()</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">a</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.11.&#160;Function get_associated_allocator"><div class="titlepage"><div><div><h4 class="title"><a name="functions.get_associated_allocator"></a>9.3.11.&#160;Function <code class="literal">get_associated_allocator</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  <span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
    <span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code>.
          </p></blockquote></div></div><div class="section" title="9.3.12.&#160;Class execution_context"><div class="titlepage"><div><div><h4 class="title"><a name="classes.execution_context"></a>9.3.12.&#160;Class <code class="literal">execution_context</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">execution_context</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">class</span> <a class="link" href="#classes.execution_context__service" title="9.3.13.&#160;Class execution_context::service">service</a><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">execution_context</span><span class="special">();</span>
        <span class="identifier">execution_context</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">execution_context</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">execution_context</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">execution_context</span><span class="special">();</span>

        <span class="comment">// execution context operations:</span>

        <span class="keyword">void</span> <span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">fork_event</span> <span class="identifier">e</span><span class="special">);</span>

      <span class="keyword">protected</span><span class="special">:</span>

        <span class="comment">// execution context protected operations:</span>

        <span class="keyword">void</span> <span class="identifier">shutdown_context</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">destroy_context</span><span class="special">();</span>
      <span class="special">};</span>

      <span class="comment">// service access:</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span> <span class="identifier">use_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span>
        <span class="identifier">make_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="keyword">bool</span> <span class="identifier">has_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">class</span> <span class="identifier">service_already_exists</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">logic_error</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Class <code class="computeroutput"><span class="identifier">execution_context</span></code>
          implements an extensible, type-safe, polymorphic set of services, indexed
          by service <span class="emphasis"><em>type</em></span>.
        </p><p>
          Access to the services of an <code class="computeroutput"><span class="identifier">execution_context</span></code>
          is via three function templates, <code class="computeroutput"><span class="identifier">use_service</span><span class="special">&lt;&gt;</span></code>, <code class="computeroutput"><span class="identifier">make_service</span><span class="special">&lt;&gt;</span></code> and <code class="computeroutput"><span class="identifier">has_service</span><span class="special">&lt;&gt;</span></code>.
        </p><p>
          In a call to <code class="computeroutput"><span class="identifier">use_service</span><span class="special">&lt;</span><span class="identifier">Service</span><span class="special">&gt;()</span></code>, the type argument chooses a service,
          making available all members of the named type. If the service is not present
          in an <code class="computeroutput"><span class="identifier">execution_context</span></code>,
          an object of type <code class="computeroutput"><span class="identifier">Service</span></code>
          is created and added to the <code class="computeroutput"><span class="identifier">execution_context</span></code>.
          A C++ program can check if an <code class="computeroutput"><span class="identifier">execution_context</span></code>
          implements a particular service with the function template <code class="computeroutput"><span class="identifier">has_service</span><span class="special">&lt;</span><span class="identifier">Service</span><span class="special">&gt;()</span></code>.
        </p><p>
          Service objects may be explicitly added to an <code class="computeroutput"><span class="identifier">execution_context</span></code>
          using the function template <code class="computeroutput"><span class="identifier">make_service</span><span class="special">&lt;</span><span class="identifier">Service</span><span class="special">&gt;()</span></code>. If the service is already present,
          the <code class="computeroutput"><span class="identifier">service_already_exists</span></code>
          exception is thrown.
        </p><p>
          Once a service reference is obtained from an <code class="computeroutput"><span class="identifier">execution_context</span></code>
          object by calling <code class="computeroutput"><span class="identifier">use_service</span><span class="special">&lt;&gt;</span></code>, that reference remains usable
          until a call to <code class="computeroutput"><span class="identifier">destroy_context</span><span class="special">()</span></code>.
        </p><div class="section" title="9.3.12.1.&#160;execution_context constructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__constructor"></a>9.3.12.1.&#160;<code class="literal">execution_context</code> constructor</h5></div></div></div><pre class="programlisting"><span class="identifier">execution_context</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Creates an object of class <code class="computeroutput"><span class="identifier">execution_context</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.12.2.&#160;execution_context destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__destructor"></a>9.3.12.2.&#160;<code class="literal">execution_context</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">execution_context</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys an object of class <code class="computeroutput"><span class="identifier">execution_context</span></code>. Performs <code class="computeroutput"><span class="identifier">shutdown_context</span><span class="special">()</span></code>
              followed by <code class="computeroutput"><span class="identifier">destroy_context</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.12.3.&#160;execution_context operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__operations"></a>9.3.12.3.&#160;<code class="literal">execution_context</code> operations</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">fork_event</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For each service object <code class="computeroutput"><span class="identifier">svc</span></code> in the set:<br> &#8212; If <code class="computeroutput"><span class="identifier">e</span> <span class="special">==</span> <span class="identifier">fork_event</span><span class="special">::</span><span class="identifier">prepare</span></code>, performs <code class="computeroutput"><span class="identifier">svc</span><span class="special">-&gt;</span><span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">e</span><span class="special">)</span></code> in reverse order of the beginning
              of service object lifetime (C++ Std, [basic.life]).<br> &#8212; Otherwise,
              performs <code class="computeroutput"><span class="identifier">svc</span><span class="special">-&gt;</span><span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">e</span><span class="special">)</span></code>
              in order of the beginning of service object lifetime.
            </p></blockquote></div></div><div class="section" title="9.3.12.4.&#160;execution_context protected operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__protected_operations"></a>9.3.12.4.&#160;<code class="literal">execution_context</code> protected operations</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">shutdown_context</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For each service object <code class="computeroutput"><span class="identifier">svc</span></code> in the <code class="computeroutput"><span class="identifier">execution_context</span></code>
              set, in reverse order of the beginning of service object lifetime (C++
              Std, [basic.life]), performs <code class="computeroutput"><span class="identifier">svc</span><span class="special">-&gt;</span><span class="identifier">shutdown_service</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> <code class="computeroutput"><span class="identifier">shutdown_context</span></code>
              is an idempotent operation. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">destroy_context</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys each service object in the
              <code class="computeroutput"><span class="identifier">execution_context</span></code> set,
              in reverse order of the beginning of service object lifetime (C++ Std,
              [basic.life]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> <code class="computeroutput"><span class="identifier">destroy_context</span></code>
              is an idempotent operation. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div></div><div class="section" title="9.3.12.5.&#160;execution_context globals"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__globals"></a>9.3.12.5.&#160;<code class="literal">execution_context</code> globals</h5></div></div></div><p>
            The functions <code class="computeroutput"><span class="identifier">use_service</span></code>,
            <code class="computeroutput"><span class="identifier">make_service</span></code> and <code class="computeroutput"><span class="identifier">has_service</span></code> shall not introduce data
            races as a result of concurrent calls to those functions from different
            threads.
          </p><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span> <span class="identifier">use_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              Let <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> if the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> exists; otherwise, let
              <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Service</span></code>
              is a service class that is publicly and unambiguously derived from
              <a class="link" href="#classes.execution_context__service" title="9.3.13.&#160;Class execution_context::service"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code></a>.
              If the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>
              exists, <code class="computeroutput"><span class="identifier">Service</span></code> is
              the same type as <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              or <code class="computeroutput"><span class="identifier">Service</span></code> is publicly
              and unambiguously derived from <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              and <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> is publicly and unambiguously
              derived from <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If an object of type <code class="computeroutput"><span class="identifier">Key</span></code>
              does not already exist in the <code class="computeroutput"><span class="identifier">execution_context</span></code>
              set identified by <code class="computeroutput"><span class="identifier">ctx</span></code>,
              creates an object of type <code class="computeroutput"><span class="identifier">Service</span></code>,
              initializing it with <code class="computeroutput"><span class="identifier">Service</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code>, and adds it to the set.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A reference to the corresponding service
              of <code class="computeroutput"><span class="identifier">ctx</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> The reference returned remains valid until
              a call to <code class="computeroutput"><span class="identifier">destroy_context</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="identifier">Service</span><span class="special">&amp;</span>
  <span class="identifier">make_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              Let <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> if the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> exists; otherwise, let
              <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Service</span></code>
              is a service class that is publicly and unambiguously derived from
              <a class="link" href="#classes.execution_context__service" title="9.3.13.&#160;Class execution_context::service"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code></a>.
              If the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>
              exists, <code class="computeroutput"><span class="identifier">Service</span></code> is
              the same type as <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              or <code class="computeroutput"><span class="identifier">Service</span></code> is publicly
              and unambiguously derived from <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              and <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> is publicly and unambiguously
              derived from <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code>.
              A service object of type <code class="computeroutput"><span class="identifier">Key</span></code>
              does not already exist in the <code class="computeroutput"><span class="identifier">execution_context</span></code>
              set identified by <code class="computeroutput"><span class="identifier">ctx</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Creates an object of type <code class="computeroutput"><span class="identifier">Service</span></code>, initializing it with <code class="computeroutput"><span class="identifier">Service</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)</span>...<span class="special">)</span></code>, and adds it to the <code class="computeroutput"><span class="identifier">execution_context</span></code> set identified
              by <code class="computeroutput"><span class="identifier">ctx</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">service_already_exists</span></code>
              if a corresponding service object of type <code class="computeroutput"><span class="identifier">Key</span></code>
              is already present in the set.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> The reference returned remains valid until
              a call to <code class="computeroutput"><span class="identifier">destroy_context</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Service</span><span class="special">&gt;</span> <span class="keyword">bool</span> <span class="identifier">has_service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              Let <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> if the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> exists; otherwise, let
              <code class="computeroutput"><span class="identifier">Key</span></code> be <code class="computeroutput"><span class="identifier">Service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Service</span></code>
              is a service class that is publicly and unambiguously derived from
              <a class="link" href="#classes.execution_context__service" title="9.3.13.&#160;Class execution_context::service"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code></a>.
              If the nested typedef <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>
              exists, <code class="computeroutput"><span class="identifier">Service</span></code> is
              the same type as <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              or <code class="computeroutput"><span class="identifier">Service</span></code> is publicly
              and unambiguously derived from <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>,
              and <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code> is publicly and unambiguously
              derived from <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If an object of type <code class="computeroutput"><span class="identifier">Key</span></code>
              is present in <code class="computeroutput"><span class="identifier">ctx</span></code>,
              <code class="computeroutput"><span class="keyword">true</span></code>; otherwise, <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.13.&#160;Class execution_context::service"><div class="titlepage"><div><div><h4 class="title"><a name="classes.execution_context__service"></a>9.3.13.&#160;Class <code class="literal">execution_context::service</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">service</span>
      <span class="special">{</span>
      <span class="keyword">protected</span><span class="special">:</span>
        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">owner</span><span class="special">);</span>
        <span class="identifier">service</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">service</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">service</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">service</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">service</span><span class="special">();</span>

        <span class="comment">// service observers:</span>

        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">execution_context</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>

        <span class="comment">// service operations:</span>

        <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">shutdown_service</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
        <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">fork_event</span> <span class="identifier">e</span><span class="special">);</span>

        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.3.13.1.&#160;execution_context::service constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__service__constructors"></a>9.3.13.1.&#160;<code class="literal">execution_context::service</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">service</span><span class="special">(</span><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">owner</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">context_</span> <span class="special">==</span>
              <span class="special">&amp;</span><span class="identifier">owner</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.13.2.&#160;execution_context::service observers"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__service__observers"></a>9.3.13.2.&#160;<code class="literal">execution_context::service</code> observers</h5></div></div></div><pre class="programlisting"><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">context_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.13.3.&#160;execution_context::service operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__service__operations"></a>9.3.13.3.&#160;<code class="literal">execution_context::service</code> operations</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">notify_fork</span><span class="special">(</span><span class="identifier">fork_event</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Does nothing.
            </p></blockquote></div></div></div><div class="section" title="9.3.14.&#160;Class template is_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.is_executor"></a>9.3.14.&#160;Class template <code class="literal">is_executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_executor</span> <span class="special">:</span> <span class="identifier">false_type</span> <span class="special">{};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">is_executor</span></code> can be used
          to detect executor types satisfying the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
          type requirements</a>.
        </p><p>
          Instantiations of the <code class="computeroutput"><span class="identifier">is_executor</span></code>
          template shall meet the UnaryTypeTrait requirements (C++ Std, [meta.rqmts]).
          A program may specialize this template for a user-defined type <code class="computeroutput"><span class="identifier">T</span></code> to have a BaseCharacteristic of <code class="computeroutput"><span class="identifier">integral_constant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> </code><code class="literal"><span class="emphasis"><em>N</em></span></code><code class="computeroutput"><span class="special">&gt;</span></code> with <code class="literal"><span class="emphasis"><em>N</em></span>
          &gt; 0</code> to indicate that <code class="computeroutput"><span class="identifier">T</span></code>
          should be treated as an executor type.
        </p></div><div class="section" title="9.3.15.&#160;Executor argument tag"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_arg_t"></a>9.3.15.&#160;Executor argument tag</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">struct</span> <span class="identifier">executor_arg_t</span> <span class="special">{</span> <span class="special">};</span>
      <span class="keyword">constexpr</span> <span class="identifier">executor_arg_t</span> <span class="identifier">executor_arg</span> <span class="special">=</span> <span class="identifier">executor_arg_t</span><span class="special">();</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The <code class="computeroutput"><span class="identifier">executor_arg_t</span></code> struct
          is an empty structure type used as a unique type to disambiguate constructor
          and function overloading. Specifically, types may have constructors with
          <code class="computeroutput"><span class="identifier">executor_arg_t</span></code> as the first
          argument, immediately followed by an argument of a type that satisfies
          the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
        </p></div><div class="section" title="9.3.16.&#160;uses_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.uses_executor"></a>9.3.16.&#160;<code class="literal">uses_executor</code></h4></div></div></div><div class="section" title="9.3.16.1.&#160;uses_executor trait"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__uses_executor__trait"></a>9.3.16.1.&#160;<code class="literal">uses_executor</code> trait</h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">uses_executor</span><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            <span class="emphasis"><em>Remark:</em></span> Detects whether <code class="computeroutput"><span class="identifier">T</span></code>
            has a nested <code class="computeroutput"><span class="identifier">executor_type</span></code>
            that is convertible from <code class="computeroutput"><span class="identifier">Executor</span></code>.
            Meets the <code class="computeroutput"><span class="identifier">BinaryTypeTrait</span></code>
            requirements (C++ Std, [meta.rqmts]). The implementation shall provide
            a definition that is derived from <code class="computeroutput"><span class="identifier">false_type</span></code>.
            A program may specialize this template to derive from <code class="computeroutput"><span class="identifier">true_type</span></code>
            for a user-defined type <code class="computeroutput"><span class="identifier">T</span></code>
            that does not have a nested <code class="computeroutput"><span class="identifier">executor_type</span></code>
            but nonetheless can be constructed with an executor where either:
          </p><p>
            &#8212; the first argument of a constructor has type <code class="computeroutput"><span class="identifier">executor_type</span></code>
            and the second argument has type <code class="computeroutput"><span class="identifier">Executor</span></code>;
            or
          </p><p>
            &#8212; the last argument of a constructor has type <code class="computeroutput"><span class="identifier">Executor</span></code>.
          </p></div><div class="section" title="9.3.16.2.&#160;uses-executor construction"><div class="titlepage"><div><div><h5 class="title"><a name="classes.uses_executor_construction"></a>9.3.16.2.&#160;uses-executor construction</h5></div></div></div><p>
            <span class="emphasis"><em>Uses-executor construction</em></span> with executor <code class="computeroutput"><span class="identifier">Executor</span></code> refers to the construction
            of an object <code class="computeroutput"><span class="identifier">obj</span></code> of type
            <code class="computeroutput"><span class="identifier">T</span></code>, using constructor
            arguments <code class="computeroutput"><span class="identifier">v1</span><span class="special">,</span>
            <span class="identifier">v2</span><span class="special">,</span>
            <span class="special">...,</span> <span class="identifier">vN</span></code>
            of types <code class="computeroutput"><span class="identifier">V1</span><span class="special">,</span>
            <span class="identifier">V2</span><span class="special">,</span>
            <span class="special">...,</span> <span class="identifier">VN</span></code>,
            respectively, and an executor <code class="computeroutput"><span class="identifier">ex</span></code>
            of type <code class="computeroutput"><span class="identifier">Executor</span></code>, according
            to the following rules:
          </p><p>
            &#8212; if <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is false and <code class="computeroutput"><span class="identifier">is_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">V1</span><span class="special">,</span> <span class="identifier">V2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">VN</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, then <code class="computeroutput"><span class="identifier">obj</span></code>
            is initialized as <code class="computeroutput"><span class="identifier">obj</span><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vN</span><span class="special">)</span></code>;
          </p><p>
            &#8212; otherwise, if <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true and <code class="computeroutput"><span class="identifier">is_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">executor_arg_t</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="identifier">V1</span><span class="special">,</span> <span class="identifier">V2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">VN</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, then <code class="computeroutput"><span class="identifier">obj</span></code>
            is initialized as <code class="computeroutput"><span class="identifier">obj</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vN</span><span class="special">)</span></code>;
          </p><p>
            &#8212; otherwise, if <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true and <code class="computeroutput"><span class="identifier">is_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">V1</span><span class="special">,</span> <span class="identifier">V2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">VN</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, then <code class="computeroutput"><span class="identifier">obj</span></code>
            is initialized as <code class="computeroutput"><span class="identifier">obj</span><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vN</span><span class="special">,</span> <span class="identifier">ex</span><span class="special">)</span></code>;
          </p><p>
            &#8212; otherwise, the request for uses-executor construction is ill-formed.
            [<span class="emphasis"><em>Note:</em></span> An error will result if <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true but the specific constructor does not take an executor. This
            definition prevents a silent failure to pass the executor to an element.
            &#8212;<span class="emphasis"><em>end note</em></span>]
          </p></div></div><div class="section" title="9.3.17.&#160;Class template associated_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.associated_executor"></a>9.3.17.&#160;Class template <code class="literal">associated_executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span> <span class="special">=</span> <span class="identifier">system_executor</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">associated_executor</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">Executor</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          A program may specialize this traits type if the <code class="computeroutput"><span class="identifier">T</span></code>
          template parameter in the specialization is a user-defined type. The template
          parameter <code class="computeroutput"><span class="identifier">Executor</span></code> shall
          be a type meeting <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
        </p><p>
          Specializations of <code class="computeroutput"><span class="identifier">associated_executor</span></code>
          shall satisfy the requirements in the table below. In this table, <code class="computeroutput"><span class="identifier">X</span></code> is a specialization of <code class="computeroutput"><span class="identifier">associated_executor</span></code> for the template
          parameter <code class="computeroutput"><span class="identifier">T</span></code>; <code class="computeroutput"><span class="identifier">t</span></code> is a const reference to an object of
          type <code class="computeroutput"><span class="identifier">T</span></code>; and <code class="computeroutput"><span class="identifier">e</span></code> is an object of type <code class="computeroutput"><span class="identifier">Executor</span></code>.
        </p><div class="table"><a name="classes.proposed_text.async.associated_executor.t0"></a><p class="title"><b>Table&#160;6.&#160;associated_executor specialization requirements</b></p><div class="table-contents"><table class="table" summary="associated_executor specialization requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Expression
                  </p>
                </th><th>
                  <p>
                    Return type
                  </p>
                </th><th>
                  <p>
                    Note
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    A type meeting <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
                    requirements</a>.
                  </p>
                </td><td>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    Shall not exit via an exception.<br> Equivalent to <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span>
                    <span class="identifier">Executor</span><span class="special">())</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span>
                    <span class="identifier">e</span><span class="special">)</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">type</span></code>
                  </p>
                </td><td>
                  <p>
                    Shall not exit via an exception.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><div class="section" title="9.3.17.1.&#160;associated_executor members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__associated_executor__members"></a>9.3.17.1.&#160;<code class="literal">associated_executor</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Type:</em></span> If <code class="computeroutput"><span class="identifier">T</span></code>
              has a nested type <code class="computeroutput"><span class="identifier">executor_type</span></code>,
              <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">executor_type</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">Executor</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">Executor</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">T</span></code>
              has a nested type <code class="computeroutput"><span class="identifier">executor_type</span></code>,
              <code class="computeroutput"><span class="identifier">t</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">e</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.18.&#160;Function get_associated_executor"><div class="titlepage"><div><div><h4 class="title"><a name="functions.get_associated_executor"></a>9.3.18.&#160;Function <code class="literal">get_associated_executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
  <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
    <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">ex</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
  <span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
    <span class="identifier">get_associated_executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">())</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.19.&#160;Class template executor_wrapper"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_wrapper"></a>9.3.19.&#160;Class template <code class="literal">executor_wrapper</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">executor_wrapper</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">wrapped_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">Executor</span> <span class="identifier">executor_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">result_type</span><span class="special">;</span>          <span class="comment">// <span class="emphasis"><em>not always defined</em></span></span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">argument_type</span><span class="special">;</span>        <span class="comment">// <span class="emphasis"><em>not always defined</em></span></span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">first_argument_type</span><span class="special">;</span>  <span class="comment">// <span class="emphasis"><em>not always defined</em></span></span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">second_argument_type</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>not always defined</em></span></span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
        <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
        <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_wrapper</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
          <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
          <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
          <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
          <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span>
            <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">executor_wrapper</span><span class="special">();</span>

        <span class="comment">// executor wrapper access:</span>

        <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">unwrap</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">unwrap</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// executor wrapper invocation:</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
          <span class="identifier">result_of_t</span><span class="special">&lt;</span><span class="emphasis"><em>cv</em></span> <span class="identifier">T</span><span class="special">&amp;(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...)&gt;</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">)</span> <span class="emphasis"><em>cv</em></span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">Executor</span> <span class="identifier">ex_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">T</span> <span class="identifier">wrapped_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Signature</span><span class="special">&gt;,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">type</span><span class="special">;</span>
      <span class="special">};</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor1</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Executor1</span><span class="special">&gt;;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code> is a wrapper around an object or function
          of type <code class="computeroutput"><span class="identifier">T</span></code>, and an executor
          object of type <code class="computeroutput"><span class="identifier">Executor</span></code>
          satisfying <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
        </p><p>
          <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code> has a weak result type (C++ Std, [func.require]).
          If <code class="computeroutput"><span class="identifier">T</span></code> is a function type,
          <code class="computeroutput"><span class="identifier">result_type</span></code> shall be a
          synonym for the return type of <code class="computeroutput"><span class="identifier">T</span></code>.
        </p><p>
          The template instantiation <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code> shall define a nested type named <code class="computeroutput"><span class="identifier">argument_type</span></code> as a synonym for <code class="computeroutput"><span class="identifier">T1</span></code> only if the type <code class="computeroutput"><span class="identifier">T</span></code>
          is any of the following:
        </p><p>
          &#8212; a function type or a pointer to function type taking one argument of type
          <code class="computeroutput"><span class="identifier">T1</span></code>
        </p><p>
          &#8212; a pointer to member function <code class="computeroutput"><span class="identifier">R</span>
          <span class="identifier">T0</span><span class="special">::</span><span class="identifier">f</span></code> <code class="literal"><span class="emphasis"><em>cv</em></span></code>
          (where <code class="literal"><span class="emphasis"><em>cv</em></span></code> represents the member
          function&#8217;s cv-qualifiers); the type <code class="computeroutput"><span class="identifier">T1</span></code>
          is <code class="literal"><span class="emphasis"><em>cv</em></span></code> <code class="computeroutput"><span class="identifier">T0</span><span class="special">*</span></code>
        </p><p>
          &#8212; a class type with a member type <code class="computeroutput"><span class="identifier">argument_type</span></code>;
          the type <code class="computeroutput"><span class="identifier">T1</span></code> is <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">argument_type</span></code>.
        </p><p>
          The template instantiation <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code> shall define two nested types named
          <code class="computeroutput"><span class="identifier">first_argument_type</span></code> and
          <code class="computeroutput"><span class="identifier">second_argument_type</span></code> as
          synonyms for <code class="computeroutput"><span class="identifier">T1</span></code> and <code class="computeroutput"><span class="identifier">T2</span></code>, respectively, only if the type <code class="computeroutput"><span class="identifier">T</span></code> is any of the following:
        </p><p>
          &#8212; a function type or a pointer to function type taking two arguments of types
          <code class="computeroutput"><span class="identifier">T1</span></code> and <code class="computeroutput"><span class="identifier">T2</span></code>
        </p><p>
          &#8212; a pointer to member function <code class="computeroutput"><span class="identifier">R</span>
          <span class="identifier">T0</span><span class="special">::</span><span class="identifier">f</span><span class="special">(</span><span class="identifier">T2</span><span class="special">)</span></code> <code class="literal"><span class="emphasis"><em>cv</em></span></code>
          (where <code class="literal"><span class="emphasis"><em>cv</em></span></code> represents the member
          function&#8217;s cv-qualifiers); the type <code class="computeroutput"><span class="identifier">T1</span></code>
          is <code class="literal"><span class="emphasis"><em>cv</em></span></code> <code class="computeroutput"><span class="identifier">T0</span><span class="special">*</span></code>
        </p><p>
          &#8212; a class type with member types <code class="computeroutput"><span class="identifier">first_argument_type</span></code>
          and <code class="computeroutput"><span class="identifier">second_argument_type</span></code>;
          the type <code class="computeroutput"><span class="identifier">T1</span></code> is <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">first_argument_type</span></code>.
          and the type <code class="computeroutput"><span class="identifier">T2</span></code> is <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">second_argument_type</span></code>.
        </p><div class="section" title="9.3.19.1.&#160;executor_wrapper constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__constructors"></a>9.3.19.1.&#160;<code class="literal">executor_wrapper</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">ex_</span></code> with
              the value <code class="computeroutput"><span class="identifier">ex</span></code>. If <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, performs uses-executor
              construction to initialize <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span>
              <span class="identifier">ex_</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">t</span><span class="special">))</span></code>;
              otherwise, initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</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">t</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">U</span></code>
              is <code class="computeroutput"><span class="identifier">T</span></code> or convertible
              to <code class="computeroutput"><span class="identifier">T</span></code>. <code class="computeroutput"><span class="identifier">OtherExecutor</span></code> is <code class="computeroutput"><span class="identifier">Executor</span></code>
              or convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">ex_</span></code> with
              <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
              If <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, performs uses-executor
              construction to initialize <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span>
              <span class="identifier">ex_</span><span class="special">,</span>
              <span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">())</span></code>;
              otherwise, initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">U</span></code>
              is <code class="computeroutput"><span class="identifier">T</span></code> or convertible
              to <code class="computeroutput"><span class="identifier">T</span></code>. <code class="computeroutput"><span class="identifier">OtherExecutor</span></code> is <code class="computeroutput"><span class="identifier">Executor</span></code>
              or convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">ex_</span></code> with
              <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
              If <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, performs uses-executor
              construction to initialize <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span>
              <span class="identifier">ex_</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">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()))</span></code>;
              otherwise, initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</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">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span>
    <span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">U</span></code>
              is <code class="computeroutput"><span class="identifier">T</span></code> or convertible
              to <code class="computeroutput"><span class="identifier">T</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">ex_</span></code> with
              <code class="computeroutput"><span class="identifier">ex</span></code>. If <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, performs uses-executor
              construction to initialize <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span>
              <span class="identifier">ex_</span><span class="special">,</span>
              <span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">())</span></code>;
              otherwise, initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">(</span><span class="identifier">executor_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span>
    <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">U</span></code>
              is <code class="computeroutput"><span class="identifier">T</span></code> or convertible
              to <code class="computeroutput"><span class="identifier">T</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">ex_</span></code> with
              <code class="computeroutput"><span class="identifier">ex</span></code>. If <code class="computeroutput"><span class="identifier">uses_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true, performs uses-executor
              construction to initialize <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">executor_arg</span><span class="special">,</span>
              <span class="identifier">ex_</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">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()))</span></code>;
              otherwise, initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</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">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()))</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.19.2.&#160;executor_wrapper access"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__access"></a>9.3.19.2.&#160;<code class="literal">executor_wrapper</code> access</h5></div></div></div><pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">unwrap</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">unwrap</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">wrapped_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">executor_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.19.3.&#160;executor_wrapper invocation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__invocation"></a>9.3.19.3.&#160;<code class="literal">executor_wrapper</code> invocation</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
  <span class="identifier">result_of_t</span><span class="special">&lt;</span><span class="emphasis"><em>cv</em></span> <span class="identifier">T</span><span class="special">&amp;(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...)&gt;</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">)</span> <span class="emphasis"><em>cv</em></span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="literal"><span class="emphasis"><em>INVOKE</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">unwrap</span><span class="special">(),</span> <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)</span>...<span class="special">)</span></code>
              (C++ Std, [func.require]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code> is described for exposition only.
              Implementations are not required to provide an actual <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>.
              Implementations are permitted to support <code class="computeroutput"><span class="identifier">executor_wrapper</span></code>
              function invocation through multiple overloaded operators or through
              other means.
            </p></blockquote></div></div><div class="section" title="9.3.19.4.&#160;Class template specialization async_result"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_specialization___async_result_"></a>9.3.19.4.&#160;Class template specialization <code class="literal">async_result</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">wrapper</span><span class="special">);</span>
        <span class="identifier">async_result</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">async_result</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>

        <span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">wrapped_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The implementation shall provide a specialization of <code class="computeroutput"><span class="identifier">async_result</span></code>
            that meets the <a class="link" href="#classes.async_result" title="9.3.8.&#160;Class template async_result"><code class="computeroutput"><span class="identifier">async_result</span></code>
            specialization requirements</a>.
          </p><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">wrapper</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              with <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">(</span><span class="identifier">wrapper</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">wrapped_</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.19.5.&#160;Class template specialization associated_allocator"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_specialization___associated_allocator_"></a>9.3.19.5.&#160;Class template specialization <code class="literal">associated_allocator</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">w</span><span class="special">,</span>
                        <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The implementation shall provide a specialization of <code class="computeroutput"><span class="identifier">associated_allocator</span></code>
            that meets the <a class="link" href="#classes.associated_allocator" title="9.3.10.&#160;Class template associated_allocator"><code class="computeroutput"><span class="identifier">associated_allocator</span></code> specialization
            requirements</a>.
          </p><pre class="programlisting"><span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">w</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">w</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.19.6.&#160;Class template specialization associated_executor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_specialization___associated_executor_"></a>9.3.19.6.&#160;Class template specialization <code class="literal">associated_executor</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor1</span><span class="special">&gt;</span>
        <span class="keyword">struct</span> <span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;,</span> <span class="identifier">Executor1</span><span class="special">&gt;</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">Executor</span> <span class="identifier">type</span><span class="special">;</span>

        <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">w</span><span class="special">,</span>
                        <span class="keyword">const</span> <span class="identifier">Executor1</span><span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">Executor1</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The implementation shall provide a specialization of <code class="computeroutput"><span class="identifier">associated_executor</span></code>
            that meets the <a class="link" href="#classes.associated_executor" title="9.3.17.&#160;Class template associated_executor"><code class="computeroutput"><span class="identifier">associated_executor</span></code> specialization
            requirements</a>.
          </p><pre class="programlisting"><span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">w</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">Executor1</span><span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">Executor1</span><span class="special">())</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">w</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.20.&#160;Function wrap"><div class="titlepage"><div><div><h4 class="title"><a name="functions.wrap"></a>9.3.20.&#160;Function <code class="literal">wrap</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">wrap</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="identifier">Executor</span><span class="special">&gt;(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">),</span> <span class="identifier">ex</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
    <span class="identifier">wrap</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">executor_wrapper</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;,</span> <span class="keyword">typename</span>
            <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">),</span> <span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">())</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.21.&#160;Class template executor_work"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_work"></a>9.3.21.&#160;Class template <code class="literal">executor_work</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">executor_work</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">Executor</span> <span class="identifier">executor_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">executor_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_work</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor_work</span><span class="special">(</span><span class="identifier">executor_work</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">executor_work</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>

        <span class="special">~</span><span class="identifier">executor_work</span><span class="special">();</span>

        <span class="comment">// executor work observers:</span>

        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="identifier">owns_work</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// executor work modifiers:</span>

        <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">Executor</span> <span class="identifier">ex_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="keyword">bool</span> <span class="identifier">owns_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.3.21.1.&#160;executor_work constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_work__constructors"></a>9.3.21.1.&#160;<code class="literal">executor_work</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">executor_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">executor_work</span></code>, initializing <code class="computeroutput"><span class="identifier">ex_</span></code> with <code class="computeroutput"><span class="identifier">ex</span></code>,
              and then performing <code class="computeroutput"><span class="identifier">ex_</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">ex</span>
              <span class="special">==</span> <span class="identifier">ex_</span></code>
              and <code class="computeroutput"><span class="identifier">owns_</span> <span class="special">==</span>
              <span class="keyword">true</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_work</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">executor_work</span></code>, initializing <code class="computeroutput"><span class="identifier">ex_</span></code> with <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">ex</span></code>.
              If <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span> <span class="special">==</span>
              <span class="keyword">true</span></code>, performs <code class="computeroutput"><span class="identifier">ex_</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">ex</span>
              <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">ex_</span></code>
              and <code class="computeroutput"><span class="identifier">owns_</span> <span class="special">==</span>
              <span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor_work</span><span class="special">(</span><span class="identifier">executor_work</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">executor_work</span></code>, initializing <code class="computeroutput"><span class="identifier">ex_</span></code> with <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">ex</span></code>
              and <code class="computeroutput"><span class="identifier">owns_</span></code> with <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">ex</span></code>
              is equal to the prior value of <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">ex_</span></code>,
              <code class="computeroutput"><span class="identifier">owns_</span></code> is equal to the
              prior value of <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span></code>,
              and <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span> <span class="special">==</span>
              <span class="keyword">false</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.21.2.&#160;executor_work destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_work__destructor"></a>9.3.21.2.&#160;<code class="literal">executor_work</code> destructor</h5></div></div></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">owns_</span></code>
              is true, performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">on_work_finished</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.21.3.&#160;executor_work observers"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_work__observers"></a>9.3.21.3.&#160;<code class="literal">executor_work</code> observers</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">ex_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">owns_work</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">owns_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.21.4.&#160;executor_work modifiers"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_work__modifiers"></a>9.3.21.4.&#160;<code class="literal">executor_work</code> modifiers</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">owns_</span></code>
              is true, performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">on_work_finished</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">owns_</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.22.&#160;Function make_work"><div class="titlepage"><div><div><h4 class="title"><a name="functions.make_work"></a>9.3.22.&#160;Function <code class="literal">make_work</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
  <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span>
    <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;(</span><span class="identifier">ex</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
  <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span>
    <span class="identifier">make_work</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> An object of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="keyword">typename</span>
            <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span></code>
            initialized with the result of <code class="computeroutput"><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span>
    <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> An object of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span></code> initialized with the result of
            <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is false and <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is false.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
  <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;</span>
    <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> An object of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;&gt;</span></code> initialized with the result of
            <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">ex</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">&gt;</span>
  <span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;&gt;</span>
    <span class="identifier">make_work</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> An object of type <code class="computeroutput"><span class="identifier">executor_work</span><span class="special">&lt;</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;&gt;</span></code>
            initialized with the result of <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">ExecutionContext</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">())</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.23.&#160;Class system_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.system_executor"></a>9.3.23.&#160;Class <code class="literal">system_executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">system_executor</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>

        <span class="comment">// executor operations:</span>

        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
      <span class="special">};</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Class <code class="computeroutput"><span class="identifier">system_executor</span></code> is
          a <code class="computeroutput"><span class="identifier">DefaultConstructible</span></code>
          type (C++ Std, [defaultconstructible]) satisfying <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
          requirements</a>. It represents a set of rules where function objects
          are permitted to execute on any thread.
        </p><p>
          To satisfy the executor requirements for the <code class="computeroutput"><span class="identifier">post</span></code>
          and <code class="computeroutput"><span class="identifier">defer</span></code> member functions,
          the system executor may allocate <code class="computeroutput"><span class="identifier">thread</span></code>
          objects to run the submitted function objects. If <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span></code>
          is called, and there remain unexecuted functions objects that have been
          submitted using <code class="computeroutput"><span class="identifier">post</span></code> or
          <code class="computeroutput"><span class="identifier">defer</span></code>, the implementation
          shall discard these function objects without calling them.
        </p><div class="section" title="9.3.23.1.&#160;system_executor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__system_executor__operations"></a>9.3.23.1.&#160;<code class="literal">system_executor</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A reference to a static-duration object
              of a type derived from <code class="computeroutput"><span class="identifier">execution_context</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Does nothing.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Does nothing.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> as if in a thread of execution
              represented by a <code class="computeroutput"><span class="identifier">thread</span></code>
              object, with the call to <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">()</span></code> being evaluated in the thread that
              called <code class="computeroutput"><span class="identifier">post</span></code>. Any exception
              propagated from the execution of <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> shall result in a call to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> as if in a thread of execution
              represented by a <code class="computeroutput"><span class="identifier">thread</span></code>
              object, with the call to <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">()</span></code> being evaluated in the thread that
              called <code class="computeroutput"><span class="identifier">defer</span></code>. Any exception
              propagated from the execution of <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> shall result in a call to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.23.2.&#160;system_executor comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__system_executor__comparisons"></a>9.3.23.2.&#160;<code class="literal">system_executor</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">system_executor</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.24.&#160;Class bad_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.bad_executor"></a>9.3.24.&#160;Class <code class="literal">bad_executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">bad_executor</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">exception</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// constructor:</span>
        <span class="identifier">bad_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          An exception of type <code class="computeroutput"><span class="identifier">bad_executor</span></code>
          is thrown by <code class="computeroutput"><span class="identifier">executor</span></code> member
          functions <code class="computeroutput"><span class="identifier">dispatch</span></code>, <code class="computeroutput"><span class="identifier">post</span></code> and <code class="computeroutput"><span class="identifier">defer</span></code>
          when the executor object has no target.
        </p><div class="section" title="9.3.24.1.&#160;bad_executor constructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__bad_executor__constructor"></a>9.3.24.1.&#160;<code class="literal">bad_executor</code> constructor</h5></div></div></div><pre class="programlisting"><span class="identifier">bad_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs a <code class="computeroutput"><span class="identifier">bad_executor</span></code>
              object.
            </p></blockquote></div></div></div><div class="section" title="9.3.25.&#160;Class executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor"></a>9.3.25.&#160;Class <code class="literal">executor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">executor</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor</span><span class="special">(</span><span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">executor</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="identifier">executor</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>

        <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor</span><span class="special">&amp;&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">executor</span><span class="special">();</span>

        <span class="comment">// executor modifiers:</span>

        <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>

        <span class="comment">// executor operations:</span>

        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>

        <span class="comment">// executor capacity:</span>

        <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// executor target access:</span>

        <span class="keyword">const</span> <span class="identifier">type_info</span><span class="special">&amp;</span> <span class="identifier">target_type</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">Executor</span><span class="special">*</span> <span class="identifier">target</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">*</span> <span class="identifier">target</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

      <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">executor</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

      <span class="comment">// executor comparisons:</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="comment">// executor specialized algorithms:</span>

      <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>

  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
    <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
      <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The <code class="computeroutput"><span class="identifier">executor</span></code> class provides
          a polymorphic wrapper for types that satisfy the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
          requirements</a>. The <span class="emphasis"><em>target object</em></span> is the executor
          object that is held by the wrapper. The <code class="computeroutput"><span class="identifier">executor</span></code>
          type itself meets the requirements for an <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor</a>.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> To meet the <code class="computeroutput"><span class="keyword">noexcept</span></code>
          requirements for executor copy constructors and move constructors, implementations
          may share a target between two or more <code class="computeroutput"><span class="identifier">executor</span></code>
          objects. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.3.25.1.&#160;executor constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__constructors"></a>9.3.25.1.&#160;<code class="literal">executor</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">(</span><span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span></code> if <code class="computeroutput"><span class="special">!</span><span class="identifier">e</span></code>; otherwise, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> targets <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">target</span><span class="special">()</span></code> or a copy of <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">target</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="special">!</span><span class="identifier">e</span></code>, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has no target; otherwise, moves
              <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">target</span><span class="special">()</span></code>
              or move-constructs the target of <code class="computeroutput"><span class="identifier">e</span></code>
              into the target of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
              leaving <code class="computeroutput"><span class="identifier">e</span></code> in a valid
              state with an unspecified value.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">executor</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Executor</span></code>
              shall satisfy the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> targets a copy of <code class="computeroutput"><span class="identifier">e</span></code> initialized with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">e</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
              overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
              is true.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="identifier">executor</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Executor</span></code>
              shall satisfy the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
              <code class="computeroutput"><span class="identifier">Allocator</span></code> conforms
              to the <code class="computeroutput"><span class="identifier">Allocator</span></code> requirements
              (C++ Std, [allocator.requirements]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> targets a copy of <code class="computeroutput"><span class="identifier">e</span></code> initialized with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">e</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              A copy of the allocator argument is used to allocate memory, if necessary,
              for the internal data structures of the constructed <code class="computeroutput"><span class="identifier">executor</span></code>
              object.
            </p></blockquote></div></div><div class="section" title="9.3.25.2.&#160;executor assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__assignment"></a>9.3.25.2.&#160;<code class="literal">executor</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">executor</span><span class="special">(</span><span class="identifier">e</span><span class="special">).</span><span class="identifier">swap</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor</span><span class="special">&amp;&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Replaces the target of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              with the target of <code class="computeroutput"><span class="identifier">e</span></code>,
              leaving <code class="computeroutput"><span class="identifier">e</span></code> in a valid
              state with an unspecified value.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">executor</span><span class="special">(</span><span class="keyword">nullptr</span><span class="special">).</span><span class="identifier">swap</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">executor</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">e</span><span class="special">)).</span><span class="identifier">swap</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
              overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
              is true.
            </p></blockquote></div></div><div class="section" title="9.3.25.3.&#160;executor destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__destructor"></a>9.3.25.3.&#160;<code class="literal">executor</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">executor</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>, releases shared ownership of,
              or destroys, the target of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.25.4.&#160;executor modifiers"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__modifiers"></a>9.3.25.4.&#160;<code class="literal">executor</code> modifiers</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Interchanges the targets of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              and <code class="computeroutput"><span class="identifier">other</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">e</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">executor</span><span class="special">(</span><span class="identifier">allocator_arg</span><span class="special">,</span> <span class="identifier">a</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">e</span><span class="special">)).</span><span class="identifier">swap</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.25.5.&#160;executor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__operations"></a>9.3.25.5.&#160;<code class="literal">executor</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">context</span><span class="special">()</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">on_work_finished</span><span class="special">()</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and <code class="computeroutput"><span class="identifier">g</span></code>
              is a function object of unspecified type that, when called as <code class="computeroutput"><span class="identifier">g</span><span class="special">()</span></code>,
              performs <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">f</span><span class="special">)()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">post</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and <code class="computeroutput"><span class="identifier">g</span></code>
              is a function object of unspecified type that, when called as <code class="computeroutput"><span class="identifier">g</span><span class="special">()</span></code>,
              performs <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">f</span><span class="special">)()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">defer</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and <code class="computeroutput"><span class="identifier">g</span></code>
              is a function object of unspecified type that, when called as <code class="computeroutput"><span class="identifier">g</span><span class="special">()</span></code>,
              performs <code class="computeroutput"><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">f</span><span class="special">)()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.25.6.&#160;executor capacity"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__capacity"></a>9.3.25.6.&#160;<code class="literal">executor</code> capacity</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              has a target, otherwise <code class="computeroutput"><span class="keyword">false</span></code>,
            </p></blockquote></div></div><div class="section" title="9.3.25.7.&#160;executor target access"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__target_access"></a>9.3.25.7.&#160;<code class="literal">executor</code> target access</h5></div></div></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">type_info</span><span class="special">&amp;</span> <span class="identifier">target_type</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has a target of type <code class="computeroutput"><span class="identifier">T</span></code>, <code class="computeroutput"><span class="keyword">typeid</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span></code>; otherwise, <code class="computeroutput"><span class="keyword">typeid</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">Executor</span><span class="special">*</span> <span class="identifier">target</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">*</span> <span class="identifier">target</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Executor</span></code>
              shall satisfy the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">target_type</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">)</span></code>
              a pointer to the stored executor target; otherwise a null pointer.
            </p></blockquote></div></div><div class="section" title="9.3.25.8.&#160;executor comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__comparisons"></a>9.3.25.8.&#160;<code class="literal">executor</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <br> &#8212; <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="special">!</span><span class="identifier">a</span></code>
              and <code class="computeroutput"><span class="special">!</span><span class="identifier">b</span></code>;<br>
              &#8212; <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">a</span></code> and <code class="computeroutput"><span class="identifier">b</span></code>
              share a target;<br> &#8212; <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">e</span></code> and <code class="computeroutput"><span class="identifier">f</span></code> are the same type and <code class="computeroutput"><span class="identifier">e</span> <span class="special">==</span> <span class="identifier">f</span></code>, where <code class="computeroutput"><span class="identifier">e</span></code>
              is the target object of <code class="computeroutput"><span class="identifier">a</span></code>
              and <code class="computeroutput"><span class="identifier">f</span></code> is the target
              object of <code class="computeroutput"><span class="identifier">b</span></code>;<br>
              &#8212; otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">e</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">nullptr_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">nullptr_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="keyword">bool</span><span class="special">)</span> <span class="identifier">e</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.25.9.&#160;executor specialized algorithms"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__specialized_algorithms"></a>9.3.25.9.&#160;<code class="literal">executor</code> specialized algorithms</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">executor</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.26.&#160;Function dispatch"><div class="titlepage"><div><div><h4 class="title"><a name="functions.dispatch"></a>9.3.26.&#160;Function <code class="literal">dispatch</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">dispatch</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex1</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Creates a work object <code class="computeroutput"><span class="identifier">w</span></code> by performing <code class="computeroutput"><span class="identifier">make_work</span><span class="special">(</span><span class="identifier">ex1</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Constructs a function object
            <code class="computeroutput"><span class="identifier">f</span></code> with a function call
            operator that performs <code class="computeroutput"><span class="identifier">ex1</span><span class="special">.</span><span class="identifier">dispatch</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code> followed by <code class="computeroutput"><span class="identifier">w</span><span class="special">.</span><span class="identifier">reset</span><span class="special">()</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">dispatch</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">f</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">(),</span>
            <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.27.&#160;Function post"><div class="titlepage"><div><div><h4 class="title"><a name="functions.post"></a>9.3.27.&#160;Function <code class="literal">post</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">post</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex1</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Creates a work object <code class="computeroutput"><span class="identifier">w</span></code> by performing <code class="computeroutput"><span class="identifier">make_work</span><span class="special">(</span><span class="identifier">ex1</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Constructs a function object
            <code class="computeroutput"><span class="identifier">f</span></code> with a function call
            operator that performs <code class="computeroutput"><span class="identifier">ex1</span><span class="special">.</span><span class="identifier">dispatch</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code> followed by <code class="computeroutput"><span class="identifier">w</span><span class="special">.</span><span class="identifier">reset</span><span class="special">()</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">post</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">f</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">post</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">(),</span>
            <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.28.&#160;Function defer"><div class="titlepage"><div><div><h4 class="title"><a name="functions.defer"></a>9.3.28.&#160;Function <code class="literal">defer</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">defer</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            Let the type <code class="computeroutput"><span class="identifier">Handler</span></code>
            be the handler function object type determined by performing <code class="computeroutput"><span class="identifier">handler_type_t</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">,</span>
            <span class="keyword">void</span><span class="special">()&gt;</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> The type <code class="computeroutput"><span class="identifier">Handler</span></code>
            must satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            requirements (C++ Std, [moveconstructible]) and be callable with zero
            arguments.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> <br> &#8212; Constructs a function object <code class="computeroutput"><span class="identifier">handler</span></code> of type <code class="computeroutput"><span class="identifier">Handler</span></code>,
            initialized with <code class="computeroutput"><span class="identifier">handler</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.<br> &#8212; Constructs an object <code class="computeroutput"><span class="identifier">result</span></code> of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span></code>, initializing the object as <code class="computeroutput"><span class="identifier">result</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the handler's associated executor object <code class="computeroutput"><span class="identifier">ex1</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Creates a work object <code class="computeroutput"><span class="identifier">w</span></code> by performing <code class="computeroutput"><span class="identifier">make_work</span><span class="special">(</span><span class="identifier">ex1</span><span class="special">)</span></code>.<br> &#8212; Obtains the handler's associated
            allocator object <code class="computeroutput"><span class="identifier">alloc</span></code>
            by performing <code class="computeroutput"><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">handler</span><span class="special">)</span></code>.<br> &#8212; Constructs a function object
            <code class="computeroutput"><span class="identifier">f</span></code> with a function call
            operator that performs <code class="computeroutput"><span class="identifier">ex1</span><span class="special">.</span><span class="identifier">dispatch</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">handler</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code> followed by <code class="computeroutput"><span class="identifier">w</span><span class="special">.</span><span class="identifier">reset</span><span class="special">()</span></code>.<br> &#8212; Performs <code class="computeroutput"><span class="identifier">ex</span><span class="special">.</span><span class="identifier">defer</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">f</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">result</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">ExecutionContext</span><span class="special">&amp;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">defer</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">(),</span>
            <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">ExecutionContext</span><span class="special">&amp;,</span> <span class="identifier">execution_context</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.3.29.&#160;Class template strand"><div class="titlepage"><div><div><h4 class="title"><a name="classes.strand"></a>9.3.29.&#160;Class template <code class="literal">strand</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">strand</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">Executor</span> <span class="identifier">inner_executor_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">strand</span><span class="special">();</span>
        <span class="keyword">explicit</span> <span class="identifier">strand</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">);</span>
        <span class="identifier">strand</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="identifier">strand</span><span class="special">(</span><span class="identifier">strand</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">(</span><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>

        <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strand</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">strand</span><span class="special">();</span>

        <span class="comment">// strand operations:</span>

        <span class="identifier">inner_executor_type</span> <span class="identifier">get_inner_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">bool</span> <span class="identifier">running_in_this_thread</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">Executor</span> <span class="identifier">inner_ex_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>
          is a wrapper around an object of type <code class="computeroutput"><span class="identifier">Executor</span></code>
          satisfying <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>.
          <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>
          satisfies the Executor requirements.
        </p><p>
          A strand provides guarantees of ordering and non-concurrency. Given:
        </p><p>
          &#8212; strand objects <code class="computeroutput"><span class="identifier">s1</span></code> and
          <code class="computeroutput"><span class="identifier">s2</span></code> such that <code class="computeroutput"><span class="identifier">s1</span> <span class="special">==</span> <span class="identifier">s2</span></code>
        </p><p>
          &#8212; a function object <code class="computeroutput"><span class="identifier">f1</span></code> added
          to the strand <code class="computeroutput"><span class="identifier">s1</span></code> using
          <code class="computeroutput"><span class="identifier">post</span></code> or <code class="computeroutput"><span class="identifier">defer</span></code>,
          or using <code class="computeroutput"><span class="identifier">dispatch</span></code> when
          <code class="computeroutput"><span class="identifier">s1</span><span class="special">.</span><span class="identifier">running_in_this_thread</span><span class="special">()</span>
          <span class="special">==</span> <span class="keyword">false</span></code>
        </p><p>
          &#8212; a function object <code class="computeroutput"><span class="identifier">f2</span></code> added
          to the strand <code class="computeroutput"><span class="identifier">s2</span></code> using
          <code class="computeroutput"><span class="identifier">post</span></code> or <code class="computeroutput"><span class="identifier">defer</span></code>,
          or using <code class="computeroutput"><span class="identifier">dispatch</span></code> when
          <code class="computeroutput"><span class="identifier">s2</span><span class="special">.</span><span class="identifier">running_in_this_thread</span><span class="special">()</span>
          <span class="special">==</span> <span class="keyword">false</span></code>
        </p><p>
          then the implementation shall invoke <code class="computeroutput"><span class="identifier">f1</span></code>
          and <code class="computeroutput"><span class="identifier">f2</span></code> such that:
        </p><p>
          &#8212; the invocation of <code class="computeroutput"><span class="identifier">f1</span></code> is
          not concurrent with the invocation of <code class="computeroutput"><span class="identifier">f2</span></code>
        </p><p>
          &#8212; the invocation of <code class="computeroutput"><span class="identifier">f1</span></code> synchronizes
          with the invocation of <code class="computeroutput"><span class="identifier">f2</span></code>.
        </p><p>
          Furthermore, if the addition of <code class="computeroutput"><span class="identifier">f1</span></code>
          happens before the addition of <code class="computeroutput"><span class="identifier">f2</span></code>,
          then the invocation of <code class="computeroutput"><span class="identifier">f1</span></code>
          happens before the invocation of <code class="computeroutput"><span class="identifier">f2</span></code>.
        </p><p>
          The strand copy constructors, comparison operators, and member functions
          shall not introduce data races as a result of concurrent calls to those
          functions from different threads.
        </p><p>
          If any function <code class="computeroutput"><span class="identifier">f</span></code> executed
          by the strand throws an exception, the subsequent strand state shall be
          as if <code class="computeroutput"><span class="identifier">f</span></code> had exited without
          throwing an exception.
        </p><div class="section" title="9.3.29.1.&#160;strand constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__constructors"></a>9.3.29.1.&#160;<code class="literal">strand</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">strand</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>
              that represents a unique ordered, non-concurrent state. Initializes
              <code class="computeroutput"><span class="identifier">inner_ex_</span></code> with <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This overload shall not participate in
              overload resolution unless <code class="computeroutput"><span class="identifier">Executor</span></code>
              satisfies the <code class="computeroutput"><span class="identifier">DefaultConstructible</span></code>
              requirements (C++ Std, [defaultconstructible]).
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">strand</span><span class="special">(</span><span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>
              that represents a unique ordered, non-concurrent state. Initializes
              <code class="computeroutput"><span class="identifier">inner_ex_</span></code> with <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">(</span><span class="identifier">ex</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">strand</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initalizes <code class="computeroutput"><span class="identifier">inner_ex_</span></code>
              with <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">inner_ex_</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">get_inner_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_inner_executor</span><span class="special">()</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">strand</span><span class="special">(</span><span class="identifier">strand</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initalizes <code class="computeroutput"><span class="identifier">inner_ex_</span></code>
              with <code class="computeroutput"><span class="identifier">inner_ex_</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">other</span><span class="special">.</span><span class="identifier">inner_ex_</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is equal to the prior value of
              <code class="computeroutput"><span class="identifier">other</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">get_inner_executor</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_inner_executor</span><span class="special">()</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initalizes <code class="computeroutput"><span class="identifier">inner_ex_</span></code>
              with <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">inner_ex_</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">(</span><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initalizes <code class="computeroutput"><span class="identifier">inner_ex_</span></code>
              with <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">inner_ex_</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is equal to the prior value of
              <code class="computeroutput"><span class="identifier">other</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.29.2.&#160;strand assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__assignment"></a>9.3.29.2.&#160;<code class="literal">strand</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Executor</span></code>
              is <code class="computeroutput"><span class="identifier">Assignable</span></code> (C++
              Std [assignable]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">get_inner_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_inner_executor</span><span class="special">()</span></code>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strand</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">Executor</span></code>
              is <code class="computeroutput"><span class="identifier">Assignable</span></code> (C++
              Std [assignable]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is equal to the prior value of
              <code class="computeroutput"><span class="identifier">other</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">get_inner_executor</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_inner_executor</span><span class="special">()</span></code>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
              <code class="computeroutput"><span class="identifier">Executor</span></code> is <code class="computeroutput"><span class="identifier">Assignable</span></code> (C++ Std [assignable]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">Executor</span><span class="special">(</span><span class="identifier">other</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherExecutor</span><span class="special">&gt;</span> <span class="identifier">strand</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">OtherExecutor</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>.
              <code class="computeroutput"><span class="identifier">Executor</span></code> is <code class="computeroutput"><span class="identifier">Assignable</span></code> (C++ Std [assignable]).
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">Executor</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">other</span><span class="special">)))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.29.3.&#160;strand destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__destructor"></a>9.3.29.3.&#160;<code class="literal">strand</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">strand</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys an object of class <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Function objects that were added to the strand but have not yet been
              executed shall still be executed in a way that meets the guarantees
              of ordering and non-concurrency.
            </p></blockquote></div></div><div class="section" title="9.3.29.4.&#160;strand operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__operations"></a>9.3.29.4.&#160;<code class="literal">strand</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">inner_executor_type</span> <span class="identifier">get_inner_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">inner_ex_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">running_in_this_thread</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if the current thread of execution is invoking a function that was
              submitted to the strand, or to any other strand object <code class="computeroutput"><span class="identifier">s</span></code> such that <code class="computeroutput"><span class="identifier">s</span>
              <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span></code>, using <code class="computeroutput"><span class="identifier">dispatch</span></code>,
              <code class="computeroutput"><span class="identifier">post</span></code> or <code class="computeroutput"><span class="identifier">defer</span></code>; otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">execution_context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">.</span><span class="identifier">context</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">inner_ex_</span><span class="special">.</span><span class="identifier">on_work_finished</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">running_in_this_thread</span><span class="special">()</span></code> is true, calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code>. Otherwise, requests invocation
              of <code class="computeroutput"><span class="identifier">f</span></code>, as if by forwarding
              the function object <code class="computeroutput"><span class="identifier">f</span></code>
              and allocator <code class="computeroutput"><span class="identifier">a</span></code> to
              the executor <code class="computeroutput"><span class="identifier">inner_ex_</span></code>,
              such that the guarantees of ordering and non-concurrency are met.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If <code class="computeroutput"><span class="identifier">f</span></code> exits via an exception,
              and the execution of <code class="computeroutput"><span class="identifier">f</span></code>
              is performed in the current thread and before <code class="computeroutput"><span class="identifier">dispatch</span></code>
              returns, the exception shall propagate to the caller of <code class="computeroutput"><span class="identifier">dispatch</span><span class="special">()</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Requests invocation of <code class="computeroutput"><span class="identifier">f</span></code>, as if by forwarding the function
              object <code class="computeroutput"><span class="identifier">f</span></code> and allocator
              <code class="computeroutput"><span class="identifier">a</span></code> to the executor
              <code class="computeroutput"><span class="identifier">inner_ex_</span></code>, such that
              the guarantees of ordering and non-concurrency are met.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Requests invocation of <code class="computeroutput"><span class="identifier">f</span></code>, as if by forwarding the function
              object <code class="computeroutput"><span class="identifier">f</span></code> and allocator
              <code class="computeroutput"><span class="identifier">a</span></code> to the executor
              <code class="computeroutput"><span class="identifier">inner_ex_</span></code>, such that
              the guarantees of ordering and non-concurrency are met.
            </p></blockquote></div></div><div class="section" title="9.3.29.5.&#160;strand comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__comparisons"></a>9.3.29.5.&#160;<code class="literal">strand</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>,
              if the strand objects share the same ordered, non-concurrent state;
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.30.&#160;Class template use_future_t"><div class="titlepage"><div><div><h4 class="title"><a name="classes.use_future_t"></a>9.3.30.&#160;Class template <code class="literal">use_future_t</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
      <span class="keyword">class</span> <span class="identifier">use_future_t</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// use_future_t types:</span>
        <span class="keyword">typedef</span> <span class="identifier">Allocator</span> <span class="identifier">allocator_type</span><span class="special">;</span>

        <span class="comment">// use_future_t members:</span>
        <span class="keyword">constexpr</span> <span class="identifier">use_future_t</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">explicit</span> <span class="identifier">use_future_t</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherAllocator</span><span class="special">&gt;</span> <span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">OtherAllocator</span><span class="special">&gt;</span>
          <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">const</span> <span class="identifier">OtherAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class template <code class="computeroutput"><span class="identifier">use_future_t</span></code>
          defines a set of <a class="link" href="#classes.handler_type" title="9.3.7.&#160;Class template handler_type">completion token
          types</a> for use with asynchronous operations.
        </p><div class="section" title="9.3.30.1.&#160;use_future_t constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__use_future_t__constructors"></a>9.3.30.1.&#160;<code class="literal">use_future_t</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">use_future_t</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs a <code class="computeroutput"><span class="identifier">use_future_t</span></code>
              with default-constructed allocator.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">use_future_t</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">use_future_t</span></code> with post-condition
              <code class="computeroutput"><span class="identifier">get_allocator</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">a</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.30.2.&#160;use_future_t members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__use_future_t__members"></a>9.3.30.2.&#160;<code class="literal">use_future_t</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherAllocator</span><span class="special">&gt;</span> <span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">OtherAllocator</span><span class="special">&gt;</span>
  <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">const</span> <span class="identifier">OtherAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">use_future_t</span></code>
              object where <code class="computeroutput"><span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The associated allocator object.
            </p></blockquote></div></div><div class="section" title="9.3.30.3.&#160;use_future_t traits"><div class="titlepage"><div><div><h5 class="title"><a name="classes.use_future_t_traits"></a>9.3.30.3.&#160;<code class="literal">use_future_t</code> traits</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">Allocator</span><span class="special">&gt;,</span> <span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;</span>
<span class="special">{</span>
  <span class="keyword">typedef</span> <span class="emphasis"><em>see below</em></span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
</pre><p>
            An object <code class="computeroutput"><span class="identifier">t1</span></code> of the nested
            function object type <code class="computeroutput"><span class="identifier">type</span></code>
            is an asynchronous provider with an associated shared state (C++Std,
            [futures.state]). The type <code class="computeroutput"><span class="identifier">type</span></code>
            provides <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>
            such that the expression <code class="computeroutput"><span class="identifier">t1</span><span class="special">(</span><span class="identifier">declval</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;()...)</span></code> is well formed.
          </p><p>
            The implementation shall specialize <code class="computeroutput"><span class="identifier">associated_executor</span></code>
            for <code class="computeroutput"><span class="identifier">type</span></code>. For function
            objects executed using the associated executor's <code class="computeroutput"><span class="identifier">dispatch</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">post</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">defer</span><span class="special">()</span></code> functions, any exception thrown is
            caught by the executor and stored in the associated shared state.
          </p><p>
            The implementation shall specialize <code class="computeroutput"><span class="identifier">async_result</span></code>
            for <code class="computeroutput"><span class="identifier">type</span></code> such that, when
            an <code class="computeroutput"><span class="identifier">async_result</span></code> object
            <code class="computeroutput"><span class="identifier">r1</span></code> is constructed from
            <code class="computeroutput"><span class="identifier">t1</span></code>, the expression <code class="computeroutput"><span class="identifier">r1</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
            returns a future with the same shared state as <code class="computeroutput"><span class="identifier">t1</span></code>.
          </p><p>
            The semantics of <code class="computeroutput"><span class="identifier">async_result</span><span class="special">::</span><span class="identifier">type</span></code>
            and <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>
            are defined in the table below. In this table, <code class="literal">N</code> is
            the value of <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">...(</span><span class="identifier">Args</span><span class="special">)</span></code>;
            let <code class="literal"><span class="emphasis"><em>i</em></span></code> be in the range [<code class="literal">0</code>..<code class="literal">N</code>)
            and let <code class="literal">T<sub><span class="emphasis"><em>i</em></span></sub></code> be the <code class="literal"><span class="emphasis"><em>i</em></span></code>th
            type in <code class="computeroutput"><span class="identifier">Args</span></code>; let <code class="literal">U<sub><span class="emphasis"><em>i</em></span></sub></code>
            be <code class="literal">decay&lt;T<sub><span class="emphasis"><em>i</em></span></sub>&gt;::type</code> for
            each type <code class="literal">T<sub><span class="emphasis"><em>i</em></span></sub></code> in <code class="computeroutput"><span class="identifier">Args</span></code>; and let <code class="literal">a<sub><span class="emphasis"><em>i</em></span></sub></code>
            be the <code class="literal"><span class="emphasis"><em>i</em></span></code>th argument to <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>.
          </p><div class="table"><a name="classes.proposed_text.async.use_future_t.use_future_t_traits.t0"></a><p class="title"><b>Table&#160;7.&#160;handler_type&lt;use_future_t&lt;Allocator&gt;, R(Args...)&gt;::type
            semantics</b></p><div class="table-contents"><table class="table" summary="handler_type&lt;use_future_t&lt;Allocator&gt;, R(Args...)&gt;::type
            semantics"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                    <p>
                      <code class="literal">N</code>
                    </p>
                  </th><th>
                    <p>
                      <code class="literal">U<sub><span class="emphasis"><em>0</em></span></sub></code>
                    </p>
                  </th><th>
                    <p>
                      <code class="computeroutput"><span class="identifier">async_result</span><span class="special">::</span><span class="identifier">type</span></code>
                    </p>
                  </th><th>
                    <p>
                      <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="keyword">operator</span></code> effects
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      0
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;void&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      Makes the shared state ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      1
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">error_code</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;void&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> evaluates to
                      <code class="computeroutput"><span class="keyword">true</span></code>, atomically
                      stores the exception pointer produced by <code class="literal">make_exception_ptr(system_error(a<sub><span class="emphasis"><em>0</em></span></sub>))</code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      1
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">exception_ptr</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;void&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> is non-null,
                      atomically stores the exception pointer <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      1
                    </p>
                  </td><td>
                    <p>
                      all other types
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;U<sub><span class="emphasis"><em>0</em></span></sub>&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      Atomically stores <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code>
                      in the shared state and makes that state ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      2
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">error_code</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;U<sub><span class="emphasis"><em>1</em></span></sub>&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> evaluates to
                      <code class="computeroutput"><span class="keyword">true</span></code>, atomically
                      stores the exception pointer produced by <code class="literal">make_exception_ptr(system_error(a<sub><span class="emphasis"><em>0</em></span></sub>))</code>
                      in the shared state; otherwise, atomically stores <code class="literal">a<sub><span class="emphasis"><em>1</em></span></sub></code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      2
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">exception_ptr</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;U<sub><span class="emphasis"><em>1</em></span></sub>&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> is non-null,
                      atomically stores the exception pointer in the shared state;
                      otherwise, atomically stores <code class="literal">a<sub><span class="emphasis"><em>1</em></span></sub></code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      2
                    </p>
                  </td><td>
                    <p>
                      all other types
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;tuple&lt;U<sub><span class="emphasis"><em>0</em></span></sub>,U<sub><span class="emphasis"><em>1</em></span></sub>&gt;&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      Atomically stores the result of <code class="literal">make_tuple(a<sub><span class="emphasis"><em>0</em></span></sub>,a<sub><span class="emphasis"><em>1</em></span></sub>)</code>
                      in the shared state and makes that state ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      &gt;2
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">error_code</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;tuple&lt;U<sub><span class="emphasis"><em>1</em></span></sub>,...,U<sub><span class="emphasis"><em>N-1</em></span></sub>&gt;&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> evaluates to
                      <code class="computeroutput"><span class="keyword">true</span></code>, atomically
                      stores the exception pointer produced by <code class="literal">make_exception_ptr(system_error(a<sub><span class="emphasis"><em>0</em></span></sub>))</code>
                      in the shared state; otherwise, atomically stores the result
                      of <code class="literal">make_tuple(a<sub><span class="emphasis"><em>1</em></span></sub>,...,a<sub><span class="emphasis"><em>N-1</em></span></sub>)</code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      &gt;2
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">exception_ptr</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;tuple&lt;U<sub><span class="emphasis"><em>1</em></span></sub>,...,U<sub><span class="emphasis"><em>N-1</em></span></sub>&gt;&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      If <code class="literal">a<sub><span class="emphasis"><em>0</em></span></sub></code> is non-null,
                      atomically stores the exception pointer in the shared state;
                      otherwise, atomically stores the result of <code class="literal">make_tuple(a<sub><span class="emphasis"><em>1</em></span></sub>,...,a<sub><span class="emphasis"><em>N-1</em></span></sub>)</code>
                      in the shared state. The shared state is made ready.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      &gt;2
                    </p>
                  </td><td>
                    <p>
                      all other types
                    </p>
                  </td><td>
                    <p>
                      <code class="literal">future&lt;tuple&lt;U<sub><span class="emphasis"><em>0</em></span></sub>,...,U<sub><span class="emphasis"><em>N-1</em></span></sub>&gt;&gt;</code>
                    </p>
                  </td><td>
                    <p>
                      Atomically stores the result of <code class="literal">make_tuple(a<sub><span class="emphasis"><em>0</em></span></sub>,...,a<sub><span class="emphasis"><em>N-1</em></span></sub>)</code>
                      in the shared state and makes that state ready.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="9.3.31.&#160;Class template specialization async_result for packaged_task"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_result_packaged_task"></a>9.3.31.&#160;Class template specialization <code class="literal">async_result</code> for
        <code class="literal">packaged_task</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">typedef</span> <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">type</span><span class="special">;</span>

        <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="identifier">async_result</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">async_result</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">async_result</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>

        <span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">type</span> <span class="identifier">future_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The implementation shall provide a specialization of <code class="computeroutput"><span class="identifier">async_result</span></code>
          that meets the <a class="link" href="#classes.async_result" title="9.3.8.&#160;Class template async_result"><code class="computeroutput"><span class="identifier">async_result</span></code>
          specialization requirements</a>.
        </p><pre class="programlisting"><span class="identifier">async_result</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initializes <code class="computeroutput"><span class="identifier">future_</span></code>
            with <code class="computeroutput"><span class="identifier">t</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">()</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">type</span> <span class="identifier">get</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">future_</span><span class="special">)</span></code>.
          </p></blockquote></div></div><div class="section" title="9.3.32.&#160;Class template packaged_handler"><div class="titlepage"><div><div><h4 class="title"><a name="classes.packaged_handler"></a>9.3.32.&#160;Class template <code class="literal">packaged_handler</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">packaged_handler</span>
        <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// packaged_handler types:</span>

        <span class="keyword">typedef</span> <span class="identifier">Alloc</span> <span class="identifier">allocator_type</span><span class="special">;</span>

        <span class="comment">// packaged_handler constructors:</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">&gt;</span>
          <span class="keyword">explicit</span> <span class="identifier">packaged_handler</span><span class="special">(</span><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="comment">// packaged_handler operations:</span>

        <span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">Alloc</span> <span class="identifier">allocator_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&gt;;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.3.32.1.&#160;packaged_handler constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_handler__constructors"></a>9.3.32.1.&#160;<code class="literal">packaged_handler</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">&gt;</span>
  <span class="keyword">explicit</span> <span class="identifier">packaged_handler</span><span class="special">(</span><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span>
              <span class="identifier">Alloc</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">f_</span><span class="special">))</span></code> and initializing <code class="computeroutput"><span class="identifier">allocator_</span></code>
              with <code class="computeroutput"><span class="identifier">token</span><span class="special">.</span><span class="identifier">allocator_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.32.2.&#160;packaged_handler operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_handler__operations"></a>9.3.32.2.&#160;<code class="literal">packaged_handler</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">allocator_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.32.3.&#160;Class template specialization async_result"><div class="titlepage"><div><div><h5 class="title"><a name="classes.async_result_packaged_handler"></a>9.3.32.3.&#160;Class template specialization <code class="literal">async_result</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&gt;</span>
        <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">&gt;&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&amp;</span> <span class="identifier">h</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The implementation shall provide a specialization of <code class="computeroutput"><span class="identifier">async_result</span></code>
            that meets the <a class="link" href="#classes.async_result" title="9.3.8.&#160;Class template async_result"><code class="computeroutput"><span class="identifier">async_result</span></code>
            specialization requirements</a>.
          </p><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">async_result</span><span class="special">(</span><span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">Signature</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;&amp;</span> <span class="identifier">h</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initializes the base class with <code class="computeroutput"><span class="identifier">h</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.33.&#160;Class template packaged_token"><div class="titlepage"><div><div><h4 class="title"><a name="classes.packaged_token"></a>9.3.33.&#160;Class template <code class="literal">packaged_token</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
      <span class="keyword">class</span> <span class="identifier">packaged_token</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// packaged_token types:</span>

        <span class="keyword">typedef</span> <span class="identifier">Alloc</span> <span class="identifier">allocator_type</span><span class="special">;</span>

        <span class="comment">// packaged_token constructors:</span>

        <span class="keyword">explicit</span> <span class="identifier">packaged_token</span><span class="special">(</span><span class="identifier">Func</span> <span class="identifier">f</span><span class="special">);</span>
        <span class="identifier">packaged_token</span><span class="special">(</span><span class="identifier">Func</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>

        <span class="comment">// packaged_token operations:</span>

        <span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">Func</span> <span class="identifier">f_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">Alloc</span> <span class="identifier">allocator_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">handler_type</span><span class="special">&lt;</span><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;,</span> <span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">result_of_t</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...)&gt;(</span><span class="identifier">Args</span><span class="special">...),</span> <span class="identifier">Alloc</span><span class="special">&gt;</span> <span class="identifier">type</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.3.33.1.&#160;packaged_token constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_token__constructors"></a>9.3.33.1.&#160;<code class="literal">packaged_token</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">packaged_token</span><span class="special">(</span><span class="identifier">Func</span> <span class="identifier">f</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span></code>,
              initializing <code class="computeroutput"><span class="identifier">f_</span></code> with
              <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>
              and default constructing <code class="computeroutput"><span class="identifier">allocator_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">packaged_token</span><span class="special">(</span><span class="identifier">Func</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span></code>,
              initializing <code class="computeroutput"><span class="identifier">f_</span></code> with
              <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>
              and <code class="computeroutput"><span class="identifier">allocator_</span></code> with
              <code class="computeroutput"><span class="identifier">a</span></code>.
            </p></blockquote></div></div><div class="section" title="9.3.33.2.&#160;packaged_token operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_token__operations"></a>9.3.33.2.&#160;<code class="literal">packaged_token</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">allocator_</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.3.34.&#160;Function package"><div class="titlepage"><div><div><h4 class="title"><a name="functions.package"></a>9.3.34.&#160;Function <code class="literal">package</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;&gt;</span>
  <span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;</span> <span class="identifier">package</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Alloc</span><span class="special">());</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">packaged_token</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a</span><span class="special">)</span></code>.
          </p></blockquote></div></div></div><div class="section" title="9.4.&#160;Basic I/O services"><div class="titlepage"><div><div><h3 class="title"><a name="network.basic_io_services"></a>9.4.&#160;Basic I/O services</h3></div></div></div><div class="section" title="9.4.1.&#160;Header &lt;experimental/io_service&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_io_service___synopsis"></a>9.4.1.&#160;Header <code class="literal">&lt;experimental/io_service&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <a class="link" href="#classes.io_service" title="9.4.2.&#160;Class io_service">io_service</a><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.4.2.&#160;Class io_service"><div class="titlepage"><div><div><h4 class="title"><a name="classes.io_service"></a>9.4.2.&#160;Class <code class="literal">io_service</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">io_service</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">execution_context</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">class</span> <a class="link" href="#classes.io_service__executor_type" title="9.4.3.&#160;Class io_service::executor_type">executor_type</a><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">io_service</span><span class="special">();</span>
        <span class="keyword">explicit</span> <span class="identifier">io_service</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">concurrency_hint</span><span class="special">);</span>
        <span class="identifier">io_service</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">io_service</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="special">~</span><span class="identifier">io_service</span><span class="special">();</span>

        <span class="comment">// io_service operations:</span>

        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">size_t</span> <span class="identifier">run</span><span class="special">();</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">run_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">run_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>

        <span class="identifier">size_t</span> <span class="identifier">run_one</span><span class="special">();</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">run_one_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">run_one_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>

        <span class="identifier">size_t</span> <span class="identifier">poll</span><span class="special">();</span>

        <span class="identifier">size_t</span> <span class="identifier">poll_one</span><span class="special">();</span>

        <span class="keyword">void</span> <span class="identifier">stop</span><span class="special">();</span>

        <span class="keyword">bool</span> <span class="identifier">stopped</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">restart</span><span class="special">();</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <a class="link" href="#definitions.synchronous_operation" title="9.1.3.&#160;synchronous operation">Synchronous operations</a>
          on I/O objects implicitly run the <code class="computeroutput"><span class="identifier">io_service</span></code>
          object for an individual operation. The <code class="computeroutput"><span class="identifier">io_service</span></code>
          functions <code class="computeroutput"><span class="identifier">run</span></code>, <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>,
          <code class="computeroutput"><span class="identifier">run_one</span></code>, <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>,
          <code class="computeroutput"><span class="identifier">poll</span></code> or <code class="computeroutput"><span class="identifier">poll_one</span></code>
          must be called for the <code class="computeroutput"><span class="identifier">io_service</span></code>
          to perform <a class="link" href="#definitions.asynchronous_operation" title="9.1.4.&#160;asynchronous operation">asynchronous
          operations</a> on behalf of a C++ program. Notification that an asynchronous
          operation has completed is delivered by execution of the associated handler
          function object, as determined by the requirements for <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
          operations</a>.
        </p><p>
          An object of type <code class="computeroutput"><span class="identifier">io_service</span></code>
          has an associated executor object, meeting the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
          type requirements</a>, of type <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code>
          and obtainable via the <code class="computeroutput"><span class="identifier">io_service</span></code>
          object's <code class="computeroutput"><span class="identifier">get_executor</span></code> member
          function.
        </p><p>
          For an object of type <code class="computeroutput"><span class="identifier">io_service</span></code>,
          <span class="emphasis"><em>outstanding work</em></span> is defined as the sum of:
        </p><p>
          &#8212; the total number of calls to the <code class="computeroutput"><span class="identifier">io_service</span></code>
          executor's <code class="computeroutput"><span class="identifier">on_work_started</span></code>
          function, less the total number of calls to the <code class="computeroutput"><span class="identifier">on_work_finished</span></code>
          function;
        </p><p>
          &#8212; the number of function objects that have been added to the <code class="computeroutput"><span class="identifier">io_service</span></code> via the <code class="computeroutput"><span class="identifier">io_service</span></code>
          executor, but not yet executed; and
        </p><p>
          &#8212; the number of function objects that are currently being executed by the
          <code class="computeroutput"><span class="identifier">io_service</span></code>.
        </p><p>
          If at any time the outstanding work falls to <code class="computeroutput"><span class="number">0</span></code>,
          the <code class="computeroutput"><span class="identifier">io_service</span></code> is stopped
          as if by <code class="computeroutput"><span class="identifier">stop</span><span class="special">()</span></code>.
        </p><p>
          The <code class="computeroutput"><span class="identifier">io_service</span></code> member functions
          <code class="computeroutput"><span class="identifier">get_executor</span></code>, <code class="computeroutput"><span class="identifier">run</span></code>, <code class="computeroutput"><span class="identifier">run_for</span></code>,
          <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>, <code class="computeroutput"><span class="identifier">run_one_for</span></code>,
          <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>, <code class="computeroutput"><span class="identifier">poll_one</span></code>,
          <code class="computeroutput"><span class="identifier">stop</span></code>, and <code class="computeroutput"><span class="identifier">stopped</span></code>, and the <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code>
          copy constructors, member functions and comparison operators, shall not
          introduce data races as a result of concurrent calls to those functions
          from different threads. [<span class="emphasis"><em>Note:</em></span> The <code class="computeroutput"><span class="identifier">restart</span></code>
          member function is excluded from these thread safety requirements. &#8212;<span class="emphasis"><em>end
          note</em></span>]
        </p><div class="section" title="9.4.2.1.&#160;io_service constructors/destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__constructors_destructor"></a>9.4.2.1.&#160;<code class="literal">io_service</code> constructors/destructor</h5></div></div></div><pre class="programlisting"><span class="identifier">io_service</span><span class="special">();</span>
<span class="keyword">explicit</span> <span class="identifier">io_service</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">concurrency_hint</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Creates an object of class <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> The <code class="computeroutput"><span class="identifier">concurrency_hint</span></code>
              parameter is a suggestion to the implementation on the number of threads
              that should process asynchronous operations and execute function objects.
            </p></blockquote></div><pre class="programlisting"><span class="special">~</span><span class="identifier">io_service</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys an object of class <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div></div><div class="section" title="9.4.2.2.&#160;io_service members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__members"></a>9.4.2.2.&#160;<code class="literal">io_service</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An executor that may be used for submitting
              function objects to the <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">run</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Must not be called from a thread that
              is currently calling one of <code class="computeroutput"><span class="identifier">run</span></code>,
              <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>,
              or <code class="computeroutput"><span class="identifier">poll_one</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to:
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">run_one</span><span class="special">())</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">n</span> <span class="special">!=</span> <span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">size_t</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">())</span>
    <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">n</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">run_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to:
</p><pre class="programlisting"><span class="keyword">return</span> <span class="identifier">run_until</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">rel_time</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">run_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to:
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">run_one_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">n</span> <span class="special">!=</span> <span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">size_t</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">())</span>
    <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">n</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">run_one</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Must not be called from a thread that
              is currently calling one of <code class="computeroutput"><span class="identifier">run</span></code>,
              <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>,
              or <code class="computeroutput"><span class="identifier">poll_one</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If the <code class="computeroutput"><span class="identifier">io_service</span></code>
              object has no oustanding work, performs <code class="computeroutput"><span class="identifier">stop</span><span class="special">()</span></code>. Otherwise, blocks while the io_service
              has outstanding work, or until the <code class="computeroutput"><span class="identifier">io_service</span></code>
              is stopped, or until one function object has been executed.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If an executed function object throws an exception, the exception shall
              be allowed to propagate to the caller of <code class="computeroutput"><span class="identifier">run_one</span><span class="special">()</span></code>. The <code class="computeroutput"><span class="identifier">io_service</span></code>
              state shall be as if the function object had returned normally.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="number">1</span></code>
              if a function object was executed, otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> This function may invoke additional handlers
              through nested calls to the <code class="computeroutput"><span class="identifier">io_service</span></code>
              executor's <code class="computeroutput"><span class="identifier">dispatch</span></code>
              member function. These do not count towards the return value.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">run_one_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to:
</p><pre class="programlisting"><span class="keyword">return</span> <span class="identifier">run_until</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">rel_time</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="number">1</span></code>
              if a function object was executed, otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">run_one_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If the <code class="computeroutput"><span class="identifier">io_service</span></code>
              object has no oustanding work, performs <code class="computeroutput"><span class="identifier">stop</span><span class="special">()</span></code>. Otherwise, blocks while the io_service
              has outstanding work, or until the expiration of the absolute timeout
              (C++ Std, [thread.req.timing]) specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>,
              or until the <code class="computeroutput"><span class="identifier">io_service</span></code>
              is stopped, or until one function object has been executed.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If an executed function object throws an exception, the exception shall
              be allowed to propagate to the caller of <code class="computeroutput"><span class="identifier">run_one</span><span class="special">()</span></code>. The <code class="computeroutput"><span class="identifier">io_service</span></code>
              state shall be as if the function object had returned normally.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="number">1</span></code>
              if a function object was executed, otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> This function may invoke additional handlers
              through nested calls to the <code class="computeroutput"><span class="identifier">io_service</span></code>
              executor's <code class="computeroutput"><span class="identifier">dispatch</span></code>
              member function. These do not count towards the return value.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">poll</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Equivalent to:
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">poll_one</span><span class="special">())</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">n</span> <span class="special">!=</span> <span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">size_t</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">())</span>
    <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">n</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">poll_one</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If the <code class="computeroutput"><span class="identifier">io_service</span></code>
              object has no oustanding work, performs <code class="computeroutput"><span class="identifier">stop</span><span class="special">()</span></code>. Otherwise, if there is a function
              object ready for immediate execution, executes it.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If an executed function object throws an exception, the exception shall
              be allowed to propagate to the caller of <code class="computeroutput"><span class="identifier">poll_one</span><span class="special">()</span></code>. The <code class="computeroutput"><span class="identifier">io_service</span></code>
              state shall be as if the function object had returned normally.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="number">1</span></code>
              if a handler was invoked, otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> This function may invoke additional handlers
              through nested calls to the <code class="computeroutput"><span class="identifier">io_service</span></code>
              executor's <code class="computeroutput"><span class="identifier">dispatch</span></code>
              member function. These do not count towards the return value.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">stop</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Stops the <code class="computeroutput"><span class="identifier">io_service</span></code>.
              Concurrent calls to <code class="computeroutput"><span class="identifier">run</span></code>,
              <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>
              or <code class="computeroutput"><span class="identifier">poll_one</span></code> will end
              as soon as possible. If a call to <code class="computeroutput"><span class="identifier">run</span></code>,
              <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>
              or <code class="computeroutput"><span class="identifier">poll_one</span></code> is currently
              executing a function object, the call will end only after completion
              of that function object. The call to <code class="computeroutput"><span class="identifier">stop</span><span class="special">()</span></code> returns without waiting for concurrent
              calls to <code class="computeroutput"><span class="identifier">run</span></code>, <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>,
              <code class="computeroutput"><span class="identifier">run_one</span></code>, <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>,
              <code class="computeroutput"><span class="identifier">poll</span></code> or <code class="computeroutput"><span class="identifier">poll_one</span></code> to complete.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">stopped</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> When <code class="computeroutput"><span class="identifier">stopped</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, subsequent calls to <code class="computeroutput"><span class="identifier">run</span></code>, <code class="computeroutput"><span class="identifier">run_for</span></code>,
              <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>, <code class="computeroutput"><span class="identifier">run_one_for</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code> or <code class="computeroutput"><span class="identifier">poll_one</span></code>
              will exit immediately with a return value of <code class="computeroutput"><span class="number">0</span></code>,
              without executing any function objects. An <code class="computeroutput"><span class="identifier">io_service</span></code>
              remains in the stopped state until a call to <code class="computeroutput"><span class="identifier">restart</span><span class="special">()</span></code>. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">restart</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">stopped</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.4.3.&#160;Class io_service::executor_type"><div class="titlepage"><div><div><h4 class="title"><a name="classes.io_service__executor_type"></a>9.4.3.&#160;Class <code class="literal">io_service::executor_type</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// construct / copy / destroy:</span>

        <span class="identifier">executor_type</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor_type</span><span class="special">(</span><span class="identifier">executor_type</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor_type</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="special">~</span><span class="identifier">executor_type</span><span class="special">();</span>

        <span class="comment">// executor operations:</span>

        <span class="keyword">bool</span> <span class="identifier">running_in_this_thread</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
      <span class="special">};</span>

      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_executor</span><span class="special">&lt;</span><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">true_type</span> <span class="special">{};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code> is a type satisfying <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor requirements</a>. Objects of
          type <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code> are associated with an
          <code class="computeroutput"><span class="identifier">io_service</span></code>, and function
          objects submitted using the <code class="computeroutput"><span class="identifier">dispatch</span></code>,
          <code class="computeroutput"><span class="identifier">post</span></code> or <code class="computeroutput"><span class="identifier">defer</span></code>
          member functions will be executed by the <code class="computeroutput"><span class="identifier">io_service</span></code>
          from within the <code class="computeroutput"><span class="identifier">run</span></code>, <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>,
          <code class="computeroutput"><span class="identifier">run_one</span></code>, <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>,
          <code class="computeroutput"><span class="identifier">poll</span></code> or <code class="computeroutput"><span class="identifier">poll_one</span></code>
          functions.
        </p><div class="section" title="9.4.3.1.&#160;io_service::executor_type constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__executor_type__constructors"></a>9.4.3.1.&#160;<code class="literal">io_service::executor_type</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor_type</span><span class="special">(</span><span class="identifier">executor_type</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is equal to the prior value of
              <code class="computeroutput"><span class="identifier">other</span></code>.
            </p></blockquote></div></div><div class="section" title="9.4.3.2.&#160;io_service::executor_type assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__executor_type__assignment"></a>9.4.3.2.&#160;<code class="literal">io_service::executor_type</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor_type</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is equal to the prior value of
              <code class="computeroutput"><span class="identifier">other</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="9.4.3.3.&#160;executor_type operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_type__operations"></a>9.4.3.3.&#160;<code class="literal">executor_type</code> operations</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">running_in_this_thread</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if the current thread of execution is invoking the <code class="computeroutput"><span class="identifier">run</span></code>,
              <code class="computeroutput"><span class="identifier">run_for</span></code>, <code class="computeroutput"><span class="identifier">run_until</span></code>, <code class="computeroutput"><span class="identifier">run_one</span></code>,
              <code class="computeroutput"><span class="identifier">run_one_for</span></code>, <code class="computeroutput"><span class="identifier">run_one_until</span></code>, <code class="computeroutput"><span class="identifier">poll</span></code>
              or <code class="computeroutput"><span class="identifier">poll_one</span></code> function
              of the associated <code class="computeroutput"><span class="identifier">io_service</span></code>
              object.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A reference to the associated <code class="computeroutput"><span class="identifier">io_service</span></code> object.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_started</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Increases the count of outstanding work
              associated with the <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">on_work_finished</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Decreases the count of outstanding work
              associated with the <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">dispatch</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">running_in_this_thread</span><span class="special">()</span></code> is true, calls <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Func</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code>. Otherwise, requests execution
              of <code class="computeroutput"><span class="identifier">f</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If <code class="computeroutput"><span class="identifier">f</span></code> exits via an exception,
              and the execution of <code class="computeroutput"><span class="identifier">f</span></code>
              is performed in the current thread and before <code class="computeroutput"><span class="identifier">dispatch</span></code>
              returns, the exception shall propagate to the caller of <code class="computeroutput"><span class="identifier">dispatch</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">post</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Requests execution of <code class="computeroutput"><span class="identifier">f</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">defer</span><span class="special">(</span><span class="identifier">Func</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Alloc</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Requests execution of <code class="computeroutput"><span class="identifier">f</span></code>.
            </p></blockquote></div></div><div class="section" title="9.4.3.4.&#160;executor_type comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_type__comparisons"></a>9.4.3.4.&#160;<code class="literal">executor_type</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">a</span><span class="special">.</span><span class="identifier">context</span><span class="special">()</span>
              <span class="special">==</span> <span class="special">&amp;</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">context</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div></div><div class="section" title="9.5.&#160;Timers"><div class="titlepage"><div><div><h3 class="title"><a name="network.timers"></a>9.5.&#160;Timers</h3></div></div></div><p>
        This subclause defines components for performing timer operations.
      </p><p>
        [<span class="emphasis"><em>Example:</em></span> Performing a synchronous wait operation on
        a timer:
</p><pre class="programlisting"><span class="identifier">io_service</span> <span class="identifier">i</span><span class="special">;</span>
<span class="identifier">steady_timer</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
<span class="identifier">t</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">5</span><span class="special">));</span>
<span class="identifier">t</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
</pre><p>
        &#8212;<span class="emphasis"><em>end example</em></span>]
      </p><p>
        [<span class="emphasis"><em>Example:</em></span> Performing an asynchronous wait operation
        on a timer:
</p><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">handler</span><span class="special">(</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">)</span> <span class="special">{</span> ... <span class="special">}</span>
...
<span class="identifier">io_service</span> <span class="identifier">i</span><span class="special">;</span>
<span class="identifier">steady_timer</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
<span class="identifier">t</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">5</span><span class="special">));</span>
<span class="identifier">t</span><span class="special">.</span><span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">handler</span><span class="special">);</span>
<span class="identifier">i</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
</pre><p>
        &#8212;<span class="emphasis"><em>end example</em></span>]
      </p><div class="section" title="9.5.1.&#160;Header &lt;experimental/timer&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_timer___synopsis"></a>9.5.1.&#160;Header <code class="literal">&lt;experimental/timer&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">chrono</span><span class="special">&gt;</span>

<span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">&gt;</span> <span class="keyword">struct</span> <a class="link" href="#classes.wait_traits" title="9.5.3.&#160;Class template wait_traits">wait_traits</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">WaitTraits</span> <span class="special">=</span> <span class="identifier">wait_traits</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">&gt;&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.basic_waitable_timer" title="9.5.4.&#160;Class template basic_waitable_timer">basic_waitable_timer</a><span class="special">;</span>

      <span class="keyword">typedef</span> <span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">system_clock</span><span class="special">&gt;</span> <span class="identifier">system_timer</span><span class="special">;</span>
      <span class="keyword">typedef</span> <span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">&gt;</span> <span class="identifier">steady_timer</span><span class="special">;</span>
      <span class="keyword">typedef</span> <span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">&gt;</span> <span class="identifier">high_resolution_timer</span><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.5.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.timers_requirements"></a>9.5.2.&#160;Requirements</h4></div></div></div><div class="section" title="9.5.2.1.&#160;Wait traits requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.wait_traits"></a>9.5.2.1.&#160;Wait traits requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a wait traits class for a type <code class="computeroutput"><span class="identifier">Clock</span></code>
            meeting the <code class="computeroutput"><span class="identifier">Clock</span></code> requirements
            (C++ Std [time.clock.req]); <code class="computeroutput"><span class="identifier">t</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span></code>;
            and <code class="computeroutput"><span class="identifier">d</span></code> denotes a value
            of type <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.timers.timers_requirements.wait_traits.t0"></a><p class="title"><b>Table&#160;8.&#160;WaitTraits requirements</b></p><div class="table-contents"><table class="table" summary="WaitTraits requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-condition
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">to_wait_duration</span><span class="special">(</span><span class="identifier">d</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code>
                      value that represents the duration <code class="computeroutput"><span class="identifier">d</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">to_wait_duration</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code>
                      value that represents the time point <code class="computeroutput"><span class="identifier">t</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="9.5.3.&#160;Class template wait_traits"><div class="titlepage"><div><div><h4 class="title"><a name="classes.wait_traits"></a>9.5.3.&#160;Class template <code class="literal">wait_traits</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">&gt;</span>
      <span class="keyword">struct</span> <span class="identifier">wait_traits</span>
      <span class="special">{</span>
        <span class="keyword">static</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">to_wait_duration</span><span class="special">(</span>
          <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>

        <span class="keyword">static</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">to_wait_duration</span><span class="special">(</span>
          <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Class template <code class="computeroutput"><span class="identifier">wait_traits</span></code>
          satisfies the <a class="link" href="#requirements.wait_traits" title="9.5.2.1.&#160;Wait traits requirements"><code class="computeroutput"><span class="identifier">WaitTraits</span></code></a>
          type requirements. Template argument <code class="computeroutput"><span class="identifier">Clock</span></code>
          is a type meeting the <code class="computeroutput"><span class="identifier">Clock</span></code>
          requirements (C++ Std [time.clock.req]).
        </p><p>
          A program may specialize this template if the <code class="computeroutput"><span class="identifier">Clock</span></code>
          template parameter in the specialization is a user-defined type.
        </p><div class="section" title="9.5.3.1.&#160;Class template wait_traits members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template___wait_traits__members"></a>9.5.3.1.&#160;Class template <code class="literal">wait_traits</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">to_wait_duration</span><span class="special">(</span>
  <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">d</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">to_wait_duration</span><span class="special">(</span>
  <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">t</span></code>,
              <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span></code>;
              if <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">::</span><span class="identifier">min</span><span class="special">()</span> <span class="special">&gt;</span> <span class="identifier">t</span></code>, <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">::</span><span class="identifier">min</span><span class="special">()</span></code>; otherwise, <code class="computeroutput"><span class="identifier">t</span>
              <span class="special">-</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.5.4.&#160;Class template basic_waitable_timer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_waitable_timer"></a>9.5.4.&#160;Class template <code class="literal">basic_waitable_timer</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">WaitTraits</span> <span class="special">=</span> <span class="identifier">wait_traits</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">&gt;&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_waitable_timer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span> <span class="identifier">executor_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">Clock</span> <span class="identifier">clock_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">duration</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">time_point</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">WaitTraits</span> <span class="identifier">traits_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
        <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
        <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_waitable_timer</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">basic_waitable_timer</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">basic_waitable_timer</span><span class="special">();</span>

        <span class="identifier">basic_waitable_timer</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_waitable_timer</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_waitable_timer</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_waitable_timer</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="comment">// basic_waitable_timer operations:</span>

        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">size_t</span> <span class="identifier">cancel</span><span class="special">();</span>
        <span class="identifier">size_t</span> <span class="identifier">cancel_one</span><span class="special">();</span>

        <span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="identifier">size_t</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.5.4.1.&#160;basic_waitable_timer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__constructors"></a>9.5.4.1.&#160;<code class="literal">basic_waitable_timer</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>,
              setting the expiry time as if by calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>,
              setting the expiry time as if by calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">basic_waitable_timer</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_waitable_timer</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.5.4.2.&#160;basic_waitable_timer destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__destructor"></a>9.5.4.2.&#160;<code class="literal">basic_waitable_timer</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">basic_waitable_timer</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys the timer, cancelling any asynchronous
              wait operations associated with the timer as if by calling <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.5.4.3.&#160;basic_waitable_timer assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__assignment"></a>9.5.4.3.&#160;<code class="literal">basic_waitable_timer</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_waitable_timer</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_waitable_timer</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Cancels any outstanding asynchronous
              operations associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as if by calling <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>,
              then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="9.5.4.4.&#160;basic_waitable_timer operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__operations"></a>9.5.4.4.&#160;<code class="literal">basic_waitable_timer</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The associated executor.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">cancel</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Causes any outstanding asynchronous wait
              operations to complete as soon as possible. Handlers for cancelled
              operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The number of operations that were cancelled.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">cancel_one</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Causes the oldest outstanding asynchronous
              wait operation, if any, to complete as soon as possible. The handler
              for the cancelled operation shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span>
              <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>
              holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The number of operations that were cancelled.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The expiry time associated with the timer,
              as previously set using <code class="computeroutput"><span class="identifier">expires_at</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">expires_after</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">service</span><span class="special">.</span><span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">implementation</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets the expiry time associated with
              the timer. Implicitly cancels asynchronous wait operations, as if by
              calling <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The number of operations that were cancelled.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">t</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Establishes the postcondition as if by
              repeatedly blocking the calling thread for the relative time produced
              by <code class="computeroutput"><span class="identifier">WaitTraits</span><span class="special">::</span><span class="identifier">to_wait_duration</span><span class="special">(</span><span class="identifier">expiry</span><span class="special">())</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span> <span class="special">||</span> <span class="special">!(</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">expiry</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous wait operation
              such that the handler is submitted for execution only when the condition
              <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span>
              <span class="special">||</span> <span class="special">!(</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">expiry</span><span class="special">())</span></code> holds.
            </p></blockquote></div></div></div></div><div class="section" title="9.6.&#160;Buffers"><div class="titlepage"><div><div><h3 class="title"><a name="network.buffers"></a>9.6.&#160;Buffers</h3></div></div></div><div class="section" title="9.6.1.&#160;Header &lt;experimental/buffer&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_buffer___synopsis"></a>9.6.1.&#160;Header <code class="literal">&lt;experimental/buffer&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">stream_errc</span> <span class="special">{</span>
        <span class="identifier">eof</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span><span class="special">,</span>
        <span class="identifier">not_found</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span>
      <span class="special">};</span>

      <span class="keyword">const</span> <span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">stream_category</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">stream_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">stream_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.mutable_buffer" title="9.6.3.&#160;Class mutable_buffer">mutable_buffer</a><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.const_buffer" title="9.6.4.&#160;Class const_buffer">const_buffer</a><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.mutable_buffers_1" title="9.6.5.&#160;Class mutable_buffers_1">mutable_buffers_1</a><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.const_buffers_1" title="9.6.6.&#160;Class const_buffers_1">const_buffers_1</a><span class="special">;</span>

      // <a class="link" href="#classes.buffer_type_traits" title="9.6.7.&#160;Buffer type traits">buffer type traits</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_mutable_buffer_sequence</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_const_buffer_sequence</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_dynamic_buffer_sequence</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer_cast" title="9.6.8.&#160;Function buffer_cast">buffer conversions</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">buffer_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">buffer_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer_size" title="9.6.9.&#160;Function buffer_size">buffer size</a>:

      <span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer_copy" title="9.6.10.&#160;Function buffer_copy">buffer copy</a>:

      <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                         <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                           <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                           <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                           <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer_arithmetic" title="9.6.11.&#160;Buffer arithmetic">buffer arithmetic</a>:

      <span class="identifier">mutable_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">mutable_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">mutable_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">mutable_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">mutable_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">mutable_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">const_buffers_1</span><span class="special">&amp;,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">const_buffers_1</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer" title="9.6.12.&#160;Buffer creation functions">buffer creation</a>:

      <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">],</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">],</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                                 <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                               <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.dynamic_vector_buffer" title="9.6.13.&#160;Class template dynamic_vector_buffer">dynamic_vector_buffer</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.dynamic_string_buffer" title="9.6.14.&#160;Class template dynamic_string_buffer">dynamic_string_buffer</a><span class="special">;</span>

      // <a class="link" href="#functions.dynamic_buffer" title="9.6.15.&#160;Dynamic buffer creation functions">dynamic buffer creation</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
        <span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.transfer_all" title="9.6.16.&#160;Class transfer_all">transfer_all</a><span class="special">;</span>
      <span class="keyword">class</span> <a class="link" href="#classes.transfer_at_least" title="9.6.17.&#160;Class transfer_at_least">transfer_at_least</a><span class="special">;</span>
      <span class="keyword">class</span> <a class="link" href="#classes.transfer_exactly" title="9.6.18.&#160;Class transfer_exactly">transfer_exactly</a><span class="special">;</span>

      // <a class="link" href="#functions.read" title="9.6.19.&#160;Synchronous read operations">synchronous read operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                      <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                      <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                      <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                      <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      // <a class="link" href="#functions.async_read" title="9.6.20.&#160;Asynchronous read operations">asynchronous read operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                          <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                          <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      // <a class="link" href="#functions.write" title="9.6.21.&#160;Synchronous write operations">synchronous write operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                       <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                       <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                       <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                       <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                       <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                     <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                       <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                       <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                       <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                       <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                       <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      // <a class="link" href="#functions.async_write" title="9.6.22.&#160;Asynchronous write operations">asynchronous write operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                           <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                           <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                           <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                           <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      // <a class="link" href="#functions.read_until" title="9.6.23.&#160;Synchronous delimited read operations">synchronous delimited read operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
        <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      // <a class="link" href="#functions.async_read_until" title="9.6.24.&#160;Asynchronous delimited read operations">asynchronous delimited read operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                                <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">,</span>
                                <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                                <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                                <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>

  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special">&lt;</span>
    <span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">stream_errc</span><span class="special">&gt;</span>
      <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>

<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.6.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.buffers_requirements"></a>9.6.2.&#160;Requirements</h4></div></div></div><div class="section" title="9.6.2.1.&#160;Convertible to mutable buffer requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.convertible_to_mutable_buffer"></a>9.6.2.1.&#160;Convertible to mutable buffer requirements</h5></div></div></div><p>
            A type that meets the requirements for convertibility to a mutable buffer
            must meet the requirements of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            types (C++ Std, 20.1.3), and the requirements of <code class="computeroutput"><span class="identifier">Assignable</span></code>
            types (C++ Std, 23.1).
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a class meeting the requirements for convertibility to a mutable
            buffer, <code class="computeroutput"><span class="identifier">a</span></code> and <code class="computeroutput"><span class="identifier">b</span></code> denote values of type <code class="computeroutput"><span class="identifier">X</span></code>, and <code class="computeroutput"><span class="identifier">u</span></code>,
            <code class="computeroutput"><span class="identifier">v</span></code> and <code class="computeroutput"><span class="identifier">w</span></code>
            denote identifiers.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.convertible_to_mutable_buffer.t0"></a><p class="title"><b>Table&#160;9.&#160;ConvertibleToMutableBuffer requirements</b></p><div class="table-contents"><table class="table" summary="ConvertibleToMutableBuffer requirements"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      postcondition
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">v</span><span class="special">;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">b</span><span class="special">);</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">mutable_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.2.&#160;Mutable buffer sequence requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.mutable_buffers"></a>9.6.2.2.&#160;Mutable buffer sequence requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a class containing objects of type <code class="computeroutput"><span class="identifier">T</span></code>,
            <code class="computeroutput"><span class="identifier">a</span></code> denotes a value of
            type <code class="computeroutput"><span class="identifier">X</span></code> and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.mutable_buffers.t0"></a><p class="title"><b>Table&#160;10.&#160;MutableBufferSequence requirements</b></p><div class="table-contents"><table class="table" summary="MutableBufferSequence requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-condition
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">T</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">T</span></code> meets the
                      requirements for <a class="link" href="#requirements.convertible_to_mutable_buffer" title="9.6.2.1.&#160;Convertible to mutable buffer requirements">ConvertibleToMutableBuffer</a>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                    <p>
                      iterator type pointing to <code class="computeroutput"><span class="identifier">T</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      meets the requirements for bidirectional iterators (C++ Std,
                      [bidirection.iterators]).
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">X</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      post:<br>
</p><pre class="programlisting"><span class="identifier">equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
  <span class="special">[](</span><span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">v1</span><span class="special">,</span>
     <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">v2</span><span class="special">)</span>
   <span class="special">{</span>
     <span class="identifier">mutable_buffer</span> <span class="identifier">b1</span><span class="special">(</span><span class="identifier">v1</span><span class="special">);</span>
     <span class="identifier">mutable_buffer</span> <span class="identifier">b2</span><span class="special">(</span><span class="identifier">v2</span><span class="special">);</span>
     <span class="keyword">return</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b1</span><span class="special">)</span>
       <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b2</span><span class="special">)</span>
         <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b1</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b2</span><span class="special">);</span>
   <span class="special">});</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="special">(&amp;</span><span class="identifier">a</span><span class="special">)-&gt;~</span><span class="identifier">X</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">void</span></code>
                    </p>
                  </td><td>
                    <p>
                      note: the destructor is applied to every element of <code class="computeroutput"><span class="identifier">a</span></code>; all the memory is deallocated.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      or convertible to <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      or convertible to <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.3.&#160;Convertible to const buffer requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.convertible_to_const_buffer"></a>9.6.2.3.&#160;Convertible to const buffer requirements</h5></div></div></div><p>
            A type that meets the requirements for convertibility to a const buffer
            must meet the requirements of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            types (C++ Std, 20.1.3), and the requirements of <code class="computeroutput"><span class="identifier">Assignable</span></code>
            types (C++ Std, 23.1).
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a class meeting the requirements for convertibility to a const
            buffer, <code class="computeroutput"><span class="identifier">a</span></code> and <code class="computeroutput"><span class="identifier">b</span></code> denote values of type <code class="computeroutput"><span class="identifier">X</span></code>, and <code class="computeroutput"><span class="identifier">u</span></code>,
            <code class="computeroutput"><span class="identifier">v</span></code> and <code class="computeroutput"><span class="identifier">w</span></code>
            denote identifiers.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.convertible_to_const_buffer.t0"></a><p class="title"><b>Table&#160;11.&#160;ConvertibleToConstBuffer requirements</b></p><div class="table-contents"><table class="table" summary="ConvertibleToConstBuffer requirements"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      postcondition
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">const_buffer</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">const_buffer</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">const_buffer</span> <span class="identifier">v</span><span class="special">;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">v</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">const_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">const_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">const_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">b</span><span class="special">);</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">const_buffer</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">w</span><span class="special">)</span>
  <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">w</span><span class="special">)</span>
</pre><p>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.4.&#160;Constant buffer sequence requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.const_buffers"></a>9.6.2.4.&#160;Constant buffer sequence requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a class containing objects of type <code class="computeroutput"><span class="identifier">T</span></code>,
            <code class="computeroutput"><span class="identifier">a</span></code> denotes a value of
            type <code class="computeroutput"><span class="identifier">X</span></code> and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.const_buffers.t0"></a><p class="title"><b>Table&#160;12.&#160;ConstBufferSequence requirements</b></p><div class="table-contents"><table class="table" summary="ConstBufferSequence requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-condition
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">T</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">T</span></code> meets the
                      requirements for <a class="link" href="#requirements.convertible_to_const_buffer" title="9.6.2.3.&#160;Convertible to const buffer requirements">ConvertibleToConstBuffer</a>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                    <p>
                      iterator type pointing to <code class="computeroutput"><span class="identifier">T</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      meets the requirements for bidirectional iterators (C++ Std,
                      [bidirection.iterators]).
                    </p>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">X</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
</pre><p>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      post:<br>
</p><pre class="programlisting"><span class="identifier">equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
  <span class="special">[](</span><span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">v1</span><span class="special">,</span>
     <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">v2</span><span class="special">)</span>
   <span class="special">{</span>
     <span class="identifier">const_buffer</span> <span class="identifier">b1</span><span class="special">(</span><span class="identifier">v1</span><span class="special">);</span>
     <span class="identifier">const_buffer</span> <span class="identifier">b2</span><span class="special">(</span><span class="identifier">v2</span><span class="special">);</span>
     <span class="keyword">return</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b1</span><span class="special">)</span>
       <span class="special">==</span> <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b2</span><span class="special">)</span>
         <span class="special">&amp;&amp;</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b1</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b2</span><span class="special">);</span>
   <span class="special">});</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="special">(&amp;</span><span class="identifier">a</span><span class="special">)-&gt;~</span><span class="identifier">X</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">void</span></code>
                    </p>
                  </td><td>
                    <p>
                      note: the destructor is applied to every element of <code class="computeroutput"><span class="identifier">a</span></code>; all the memory is deallocated.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      or convertible to <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                      or convertible to <code class="computeroutput"><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.5.&#160;Dynamic buffer sequence requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.dynamic_buffers"></a>9.6.2.5.&#160;Dynamic buffer sequence requirements</h5></div></div></div><p>
            A dynamic buffer sequence encapsulates memory storage that may be automatically
            resized as required, where the memory is divided into an input sequence
            followed by an output sequence. These memory regions are internal to
            the dynamic buffer sequence, but direct access to the elements is provided
            to permit them to be efficiently used with I/O operations, such as the
            <code class="computeroutput"><span class="identifier">send</span></code> or <code class="computeroutput"><span class="identifier">receive</span></code> operations of a socket. Data
            written to the output sequence of a dynamic buffer sequence object is
            appended to the input sequence of the same object.
          </p><p>
            A dynamic buffer sequence type <code class="computeroutput"><span class="identifier">X</span></code>
            shall satisfy the requirements of <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
            (C++ Std, [moveconstructible]) types in addition to those listed below.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a dynamic buffer sequence class, <code class="computeroutput"><span class="identifier">x</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span><span class="special">&amp;</span></code>, <code class="computeroutput"><span class="identifier">x1</span></code>
            denotes values of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span></code>,
            and <code class="computeroutput"><span class="identifier">n</span></code> denotes a value
            of type <code class="computeroutput"><span class="identifier">size_t</span></code>, and
            <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.dynamic_buffers.t0"></a><p class="title"><b>Table&#160;13.&#160;DynamicBufferSequence requirements</b></p><div class="table-contents"><table class="table" summary="DynamicBufferSequence requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_buffers_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      type meeting <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">ConstBufferSequence</a>
                      requirements.
                    </p>
                  </td><td>
                    <p>
                      This type represents the memory associated with the input sequence.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">mutable_buffers_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      type meeting <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">MutableBufferSequence</a>
                      requirements.
                    </p>
                  </td><td>
                    <p>
                      This type represents the memory associated with the output
                      sequence.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns the size, in bytes, of the input sequence.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns the permitted maximum of the sum of the sizes of the
                      input sequence and output sequence.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns the maximum sum of the sizes of the input sequence
                      and output sequence that the dynamic buffer sequence can hold
                      without requiring reallocation.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_buffers_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a constant buffer sequence <code class="computeroutput"><span class="identifier">u</span></code>
                      that represents the memory associated with the input sequence,
                      and where <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span>
                      <span class="identifier">size</span><span class="special">()</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">prepare</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">mutable_buffers_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      Requires: <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span>
                      <span class="identifier">n</span> <span class="special">&lt;=</span>
                      <span class="identifier">max_size</span><span class="special">()</span></code>.<br>
                      <br> Returns a mutable buffer sequence <code class="computeroutput"><span class="identifier">u</span></code>
                      representing the output sequence, and where <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">u</span><span class="special">)</span> <span class="special">==</span>
                      <span class="identifier">n</span></code>. The dynamic buffer
                      sequence reallocates memory as required. All constant or mutable
                      buffer sequences previously obtained using <code class="computeroutput"><span class="identifier">data</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">prepare</span><span class="special">()</span></code> are invalidated.<br> <br>
                      Throws: <code class="computeroutput"><span class="identifier">length_error</span></code>
                      if <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span>
                      <span class="special">+</span> <span class="identifier">n</span>
                      <span class="special">&gt;</span> <span class="identifier">max_size</span><span class="special">()</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">commit</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Appends <code class="computeroutput"><span class="identifier">n</span></code> bytes
                      from the start of the output sequence to the end of the input
                      sequence. The remainder of the output sequence is discarded.
                      If <code class="computeroutput"><span class="identifier">n</span></code> is greater
                      than the size of the output sequence, the entire output sequence
                      is appended to the input sequence. All constant or mutable
                      buffer sequences previously obtained using <code class="computeroutput"><span class="identifier">data</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">prepare</span><span class="special">()</span></code> are invalidated.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">consume</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      Removes <code class="computeroutput"><span class="identifier">n</span></code> bytes
                      from beginning of the input sequence. If <code class="computeroutput"><span class="identifier">n</span></code>
                      is greater than the size of the input sequence, the entire
                      input sequence is removed. All constant or mutable buffer sequences
                      previously obtained using <code class="computeroutput"><span class="identifier">data</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">prepare</span><span class="special">()</span></code> are invalidated.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.6.&#160;Requirements on synchronous read operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.synchronous_read_operations"></a>9.6.2.6.&#160;Requirements on synchronous read operations</h5></div></div></div><p>
            In this clause, a <span class="emphasis"><em>synchronous read operation</em></span> is
            a function that reads data into a <span class="emphasis"><em>mutable buffer sequence</em></span>
            argument of a type meeting <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">MutableBufferSequence</a>
            requirements.
          </p><p>
            The mutable buffer sequence specifies memory where the data should be
            placed. A synchronous read operation shall always fill a buffer in the
            sequence completely before proceeding to the next.
          </p></div><div class="section" title="9.6.2.7.&#160;Requirements on asynchronous read operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_read_operations"></a>9.6.2.7.&#160;Requirements on asynchronous read operations</h5></div></div></div><p>
            In this clause, an <span class="emphasis"><em>asynchronous read operation</em></span> is
            an <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
            operation</a> that reads data into a <span class="emphasis"><em>mutable buffer sequence</em></span>
            argument of a type meeting <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">MutableBufferSequence</a>
            requirements.
          </p><p>
            The mutable buffer sequence specifies memory where the data should be
            placed. An asynchronous read operation shall always fill a buffer in
            the sequence completely before proceeding to the next.
          </p><p>
            The read operation's implementation shall maintain one or more copies
            of the buffer sequence until such time as the read operation no longer
            requires access to the memory specified by the buffers in the sequence.
            The program must ensure the memory is valid until:
          </p><p>
            &#8212; the last copy of the buffer sequence is destroyed, or
          </p><p>
            &#8212; the handler for the asynchronous operation is invoked,
          </p><p>
            whichever comes first.
          </p></div><div class="section" title="9.6.2.8.&#160;Requirements on synchronous write operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.synchronous_write_operations"></a>9.6.2.8.&#160;Requirements on synchronous write operations</h5></div></div></div><p>
            In this clause, a <span class="emphasis"><em>synchronous write operation</em></span> is
            a function that writes data from a <span class="emphasis"><em>constant buffer sequence</em></span>
            argument of a type meeting <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">ConstBufferSequence</a>
            requirements.
          </p><p>
            The constant buffer sequence specifies memory where the data to be written
            is located. A synchronous write operation shall always write a buffer
            in the sequence completely before proceeding to the next.
          </p></div><div class="section" title="9.6.2.9.&#160;Requirements on asynchronous write operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_write_operations"></a>9.6.2.9.&#160;Requirements on asynchronous write operations</h5></div></div></div><p>
            In this clause, an <span class="emphasis"><em>asynchronous write operation</em></span>
            is an <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
            operation</a> that writes data from a <span class="emphasis"><em>constant buffer sequence</em></span>
            argument of a type meeting <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">ConstBufferSequence</a>
            requirements.
          </p><p>
            The constant buffer sequence specifies memory where the data to be written
            is located. An asynchronous write operation shall always write a buffer
            in the sequence completely before proceeding to the next.
          </p><p>
            The write operation's implementation shall maintain one or more copies
            of the buffer sequence until such time as the write operation no longer
            requires access to the memory specified by the buffers in the sequence.
            The program must ensure the memory is valid until:
          </p><p>
            &#8212; the last copy of the buffer sequence is destroyed, or
          </p><p>
            &#8212; the handler for the asynchronous operation is invoked,
          </p><p>
            whichever comes first.
          </p></div><div class="section" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.sync_read_stream"></a>9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a synchronous read stream object, <code class="computeroutput"><span class="identifier">mb</span></code>
            denotes an object satisfying <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable
            buffer sequence</a> requirements, and <code class="computeroutput"><span class="identifier">ec</span></code>
            denotes an object of type <code class="computeroutput"><span class="identifier">error_code</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.sync_read_stream.t0"></a><p class="title"><b>Table&#160;14.&#160;Buffer-oriented synchronous read stream requirements</b></p><div class="table-contents"><table class="table" summary="Buffer-oriented synchronous read stream requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      operation
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      semantics, pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">mb</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Equivalent to:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">size_t</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">mb</span><span class="special">,</span> <span class="identifier">ec</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="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">__func__</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">s</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">mb</span><span class="special">,</span><span class="identifier">ec</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Meets the requirements for a <a class="link" href="#requirements.synchronous_read_operations" title="9.6.2.6.&#160;Requirements on synchronous read operations">synchronous
                      read operation</a>.<br> <br> Reads one or more bytes
                      of data from the stream <code class="computeroutput"><span class="identifier">a</span></code>.<br>
                      <br> If successful, returns the number of bytes read and
                      sets <code class="computeroutput"><span class="identifier">ec</span></code> such
                      that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>
                      is true. If an error occurred, returns <code class="computeroutput"><span class="number">0</span></code>
                      and sets <code class="computeroutput"><span class="identifier">ec</span></code>
                      such that <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span></code>
                      is true. If all data has been read from the stream and the
                      stream has been shut down in an orderly manner, sets <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
                      <span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">eof</span></code>.<br> <br> The operation
                      shall not block if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">mb</span><span class="special">)</span> <span class="special">==</span>
                      <span class="number">0</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.async_read_stream"></a>9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes an asynchronous read stream object, <code class="computeroutput"><span class="identifier">mb</span></code>
            denotes an object satisfying <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable
            buffer sequence</a> requirements, and <code class="computeroutput"><span class="identifier">t</span></code>
            is a completion token.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.async_read_stream.t0"></a><p class="title"><b>Table&#160;15.&#160;Buffer-oriented asynchronous read stream requirements</b></p><div class="table-contents"><table class="table" summary="Buffer-oriented asynchronous read stream requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      operation
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      semantics, pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      A type satisfying the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
                      requirements</a>.
                    </p>
                  </td><td>
                    <p>
                      Returns the associated I/O executor.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">mb</span><span class="special">,</span><span class="identifier">t</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      The return type is determined according to the requirements
                      for an <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
                      operation</a>.
                    </p>
                  </td><td>
                    <p>
                      Meets the requirements for an <a class="link" href="#requirements.asynchronous_read_operations" title="9.6.2.7.&#160;Requirements on asynchronous read operations">asynchronous
                      read operation</a> with completion signature <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span>
                      <span class="identifier">n</span><span class="special">)</span></code>.<br>
                      <br> Initiates an asynchronous operation to read one or more
                      bytes of data from the stream <code class="computeroutput"><span class="identifier">a</span></code>.<br>
                      <br> If successful, <code class="computeroutput"><span class="identifier">n</span></code>
                      is the number of bytes read and <code class="computeroutput"><span class="identifier">ec</span></code>
                      is set such that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code> is true. If an error occurred,
                      <code class="computeroutput"><span class="identifier">n</span></code> is <code class="computeroutput"><span class="number">0</span></code> and <code class="computeroutput"><span class="identifier">ec</span></code>
                      is set such that <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span></code> is true. If all data has
                      been read from the stream and the stream has been shut down
                      in an orderly manner, <code class="computeroutput"><span class="identifier">n</span></code>
                      is <code class="computeroutput"><span class="number">0</span></code> and <code class="computeroutput"><span class="identifier">ec</span></code> is set such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
                      <span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">eof</span></code>.<br> <br> The operation
                      shall complete immediately if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">mb</span><span class="special">)</span> <span class="special">==</span>
                      <span class="number">0</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.sync_write_stream"></a>9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a synchronous write stream object, <code class="computeroutput"><span class="identifier">cb</span></code>
            denotes an object satisfying <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant
            buffer sequence</a> requirements, and <code class="computeroutput"><span class="identifier">ec</span></code>
            denotes an object of type <code class="computeroutput"><span class="identifier">error_code</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.sync_write_stream.t0"></a><p class="title"><b>Table&#160;16.&#160;Buffer-oriented synchronous write stream requirements</b></p><div class="table-contents"><table class="table" summary="Buffer-oriented synchronous write stream requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      operation
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      semantics, pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">write_some</span><span class="special">(</span><span class="identifier">cb</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Equivalent to:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">size_t</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">write_some</span><span class="special">(</span><span class="identifier">cb</span><span class="special">,</span> <span class="identifier">ec</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="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">__func__</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">s</span><span class="special">;</span>
</pre><p>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">write_some</span><span class="special">(</span><span class="identifier">cb</span><span class="special">,</span><span class="identifier">ec</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Meets the requirements for a <a class="link" href="#requirements.synchronous_write_operations" title="9.6.2.8.&#160;Requirements on synchronous write operations">synchronous
                      write operation</a>.<br> <br> Writes one or more bytes
                      of data to the stream <code class="computeroutput"><span class="identifier">a</span></code>.<br>
                      <br> If successful, returns the number of bytes written and
                      sets <code class="computeroutput"><span class="identifier">ec</span></code> such
                      that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>
                      is true. If an error occurred, returns <code class="computeroutput"><span class="number">0</span></code>
                      and sets <code class="computeroutput"><span class="identifier">ec</span></code>
                      such that <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span></code>
                      is true.<br> <br> The operation shall not block if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">cb</span><span class="special">)</span>
                      <span class="special">==</span> <span class="number">0</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.async_write_stream"></a>9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes an asynchronous write stream object, <code class="computeroutput"><span class="identifier">cb</span></code>
            denotes an object satisfying <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant
            buffer sequence</a> requirements, and <code class="computeroutput"><span class="identifier">t</span></code>
            is a completion token.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.async_write_stream.t0"></a><p class="title"><b>Table&#160;17.&#160;Buffer-oriented asynchronous write stream requirements</b></p><div class="table-contents"><table class="table" summary="Buffer-oriented asynchronous write stream requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      operation
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      semantics, pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      A type satisfying the <a class="link" href="#requirements.executor" title="9.3.6.2.&#160;Executor requirements">Executor
                      requirements</a>.
                    </p>
                  </td><td>
                    <p>
                      Returns the associated I/O executor.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">async_write_some</span><span class="special">(</span><span class="identifier">cb</span><span class="special">,</span><span class="identifier">t</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      The return type is determined according to the requirements
                      for an <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
                      operation</a>.
                    </p>
                  </td><td>
                    <p>
                      Meets the requirements for an <a class="link" href="#requirements.asynchronous_write_operations" title="9.6.2.9.&#160;Requirements on asynchronous write operations">asynchronous
                      write operation</a> with completion signature <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span>
                      <span class="identifier">n</span><span class="special">)</span></code>.<br>
                      <br> Initiates an asynchronous operation to write one or
                      more bytes of data to the stream <code class="computeroutput"><span class="identifier">a</span></code>.<br>
                      <br> If successful, <code class="computeroutput"><span class="identifier">n</span></code>
                      is the number of bytes written and <code class="computeroutput"><span class="identifier">ec</span></code>
                      is set such that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code> is true. If an error occurred,
                      <code class="computeroutput"><span class="identifier">n</span></code> is <code class="computeroutput"><span class="number">0</span></code> and <code class="computeroutput"><span class="identifier">ec</span></code>
                      is set such that <code class="computeroutput"><span class="special">!!</span><span class="identifier">ec</span></code> is true.<br> <br>
                      The operation shall complete immediately if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">cb</span><span class="special">)</span> <span class="special">==</span>
                      <span class="number">0</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="9.6.3.&#160;Class mutable_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.mutable_buffer"></a>9.6.3.&#160;Class <code class="literal">mutable_buffer</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">mutable_buffer</span></code> class
          meets the requirements for <a class="link" href="#requirements.convertible_to_mutable_buffer" title="9.6.2.1.&#160;Convertible to mutable buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToMutableBuffer</span></code></a> and
          <a class="link" href="#requirements.convertible_to_const_buffer" title="9.6.2.3.&#160;Convertible to const buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToConstBuffer</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">mutable_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// constructors:</span>
        <span class="identifier">mutable_buffer</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">mutable_buffer</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="keyword">void</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">size_t</span> <span class="identifier">size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.6.3.1.&#160;mutable_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffer__constructors"></a>9.6.3.1.&#160;<code class="literal">mutable_buffer</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">mutable_buffer</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">data_</span>
              <span class="special">==</span> <span class="keyword">nullptr</span></code>
              and <code class="computeroutput"><span class="identifier">size_</span> <span class="special">==</span>
              <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffer</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">data_</span>
              <span class="special">==</span> <span class="identifier">p</span></code>
              and <code class="computeroutput"><span class="identifier">size_</span> <span class="special">==</span>
              <span class="identifier">n</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.6.4.&#160;Class const_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.const_buffer"></a>9.6.4.&#160;Class <code class="literal">const_buffer</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">const_buffer</span></code> class
          meets the requirements for <a class="link" href="#requirements.convertible_to_const_buffer" title="9.6.2.3.&#160;Convertible to const buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToConstBuffer</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">const_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// constructors:</span>
        <span class="identifier">const_buffer</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">size_t</span> <span class="identifier">size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.6.4.1.&#160;const_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffer__constructors"></a>9.6.4.1.&#160;<code class="literal">const_buffer</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">const_buffer</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">data_</span>
              <span class="special">==</span> <span class="keyword">nullptr</span></code>
              and <code class="computeroutput"><span class="identifier">size_t</span> <span class="special">==</span>
              <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">data_</span>
              <span class="special">==</span> <span class="identifier">p</span></code>
              and <code class="computeroutput"><span class="identifier">size_</span> <span class="special">==</span>
              <span class="identifier">n</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">data_</span>
              <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">data_</span></code>
              and <code class="computeroutput"><span class="identifier">size_</span> <span class="special">==</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">size_</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.6.5.&#160;Class mutable_buffers_1"><div class="titlepage"><div><div><h4 class="title"><a name="classes.mutable_buffers_1"></a>9.6.5.&#160;Class <code class="literal">mutable_buffers_1</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code> class
          meets the requirements for <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements"><code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code></a>, <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements"><code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code></a>, <a class="link" href="#requirements.convertible_to_mutable_buffer" title="9.6.2.1.&#160;Convertible to mutable buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToMutableBuffer</span></code></a>, and
          <a class="link" href="#requirements.convertible_to_mutable_buffer" title="9.6.2.1.&#160;Convertible to mutable buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToConstBuffer</span></code></a>.
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code> is derived
          from <code class="computeroutput"><span class="identifier">mutable_buffer</span></code> so
          that it is convertible to both <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
          and <code class="computeroutput"><span class="identifier">const_buffer</span></code>, while
          ensuring that the conversion to <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
          is the better conversion. This prevents ambiguities when passing to functions
          that are overloaded on both <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
          and <code class="computeroutput"><span class="identifier">const_buffer</span></code>, such
          as <a class="link" href="#functions.buffer" title="9.6.12.&#160;Buffer creation functions"><code class="computeroutput"><span class="identifier">buffer</span><span class="special">()</span></code></a>.
        </p></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">mutable_buffers_1</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">mutable_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>
        <span class="keyword">typedef</span> <span class="identifier">mutable_buffer</span> <span class="identifier">value_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">const_iterator</span><span class="special">;</span>

        <span class="comment">// constructors:</span>
        <span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">explicit</span> <span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// members:</span>
        <span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          An object of class <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
          represents a sequence of exactly one <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
          object.
        </p><div class="section" title="9.6.5.1.&#160;mutable_buffers_1 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffers_1__constructors"></a>9.6.5.1.&#160;<code class="literal">mutable_buffers_1</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>, initializing the
              base class with <code class="computeroutput"><span class="identifier">mutable_buffer</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>, initializing the
              base class with <code class="computeroutput"><span class="identifier">mutable_buffer</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.6.5.2.&#160;mutable_buffers_1 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffers_1__members"></a>9.6.5.2.&#160;<code class="literal">mutable_buffers_1</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator referring to the first (and
              only) <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
              object in the sequence.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator which is the past-the-end
              value.
            </p></blockquote></div></div></div><div class="section" title="9.6.6.&#160;Class const_buffers_1"><div class="titlepage"><div><div><h4 class="title"><a name="classes.const_buffers_1"></a>9.6.6.&#160;Class <code class="literal">const_buffers_1</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">const_buffers_1</span></code> class
          meets the requirements for <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements"><code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code></a>, and <a class="link" href="#requirements.convertible_to_const_buffer" title="9.6.2.3.&#160;Convertible to const buffer requirements"><code class="computeroutput"><span class="identifier">ConvertibleToConstBuffer</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">const_buffers_1</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">const_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>
        <span class="keyword">typedef</span> <span class="identifier">const_buffer</span> <span class="identifier">value_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">const_iterator</span><span class="special">;</span>

        <span class="comment">// constructors:</span>
        <span class="identifier">const_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">explicit</span> <span class="identifier">const_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// members:</span>
        <span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          An object of class <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
          represents a sequence of exactly one <code class="computeroutput"><span class="identifier">const_buffer</span></code>
          object.
        </p><div class="section" title="9.6.6.1.&#160;const_buffers_1 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffers_1__constructors"></a>9.6.6.1.&#160;<code class="literal">const_buffers_1</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>, initializing the
              base class with <code class="computeroutput"><span class="identifier">const_buffer</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">const_buffers_1</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>, initializing the
              base class with <code class="computeroutput"><span class="identifier">const_buffer</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.6.6.2.&#160;const_buffers_1 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffers_1__members"></a>9.6.6.2.&#160;<code class="literal">const_buffers_1</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator referring to the first (and
              only) <code class="computeroutput"><span class="identifier">const_buffer</span></code>
              object in the sequence.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator which is the past-the-end
              value.
            </p></blockquote></div></div></div><div class="section" title="9.6.7.&#160;Buffer type traits"><div class="titlepage"><div><div><h4 class="title"><a name="classes.buffer_type_traits"></a>9.6.7.&#160;Buffer type traits</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_mutable_buffer_sequence</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_const_buffer_sequence</span><span class="special">;</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_dynamic_buffer_sequence</span><span class="special">;</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          This sub-clause contains templates that may be used to query the properties
          of a type at compile time. Each of these templates shall be a UnaryTypeTrait
          (C++ Std, [meta.rqmts]) with a BaseCharacteristic of <code class="computeroutput"><span class="identifier">true_type</span></code>
          if the corresponding condition is true, otherwise <code class="computeroutput"><span class="identifier">false_type</span></code>.
        </p><div class="table"><a name="classes.proposed_text.buffers.buffer_type_traits.t0"></a><p class="title"><b>Table&#160;18.&#160;Buffer type traits</b></p><div class="table-contents"><table class="table" summary="Buffer type traits"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Template
                  </p>
                </th><th>
                  <p>
                    Condition
                  </p>
                </th><th>
                  <p>
                    Preconditions
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_mutable_buffer_sequence</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> meets the requirements
                    for <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable buffer
                    sequence</a>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> is a complete
                    type.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_const_buffer_sequence</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> meets the requirements
                    for <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant buffer
                    sequence</a>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> is a complete
                    type.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">is_dynamic_buffer_sequence</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> meets the requirements
                    for <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic buffer
                    sequence</a>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> is a complete
                    type.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.6.8.&#160;Function buffer_cast"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_cast"></a>9.6.8.&#160;Function <code class="literal">buffer_cast</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">buffer_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">buffer_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">data_</span><span class="special">)</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.9.&#160;Function buffer_size"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_size"></a>9.6.9.&#160;Function <code class="literal">buffer_size</code></h4></div></div></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size_</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The total size of all buffers in the sequence,
            as if computed as follows:<br>
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">total_size</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">const</span> <span class="keyword">auto</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">:</span> <span class="identifier">buffers</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">const_buffer</span> <span class="identifier">b</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
  <span class="identifier">total_size</span> <span class="special">+=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">size_</span><span class="special">;</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="identifier">total_size</span><span class="special">;</span>
</pre><p>
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function overload shall not participate
            in overload resolution unless <code class="computeroutput"><span class="identifier">is_const_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">ConstBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.6.10.&#160;Function buffer_copy"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_copy"></a>9.6.10.&#160;Function <code class="literal">buffer_copy</code></h4></div></div></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                   <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                   <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                   <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                     <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                     <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">buffer_copy</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">dest</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">source</span><span class="special">,</span>
                     <span class="identifier">max_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Copies bytes from the buffer or buffer
            sequence <code class="computeroutput"><span class="identifier">source</span></code> to the
            buffer or buffer sequence <code class="computeroutput"><span class="identifier">dest</span></code>,
            as if by calls to <code class="computeroutput"><span class="identifier">memcpy</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The number of bytes copied is the lesser of:<br> &#8212; <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">dest</span><span class="special">)</span></code>;<br> &#8212; <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">source</span><span class="special">)</span></code>; and<br> &#8212; <code class="computeroutput"><span class="identifier">max_size</span></code>,
            if specified.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The mutable buffer or mutable buffer sequence <code class="computeroutput"><span class="identifier">dest</span></code>
            specifies memory where the data should be placed. The operation shall
            always fill a buffer in the sequence completely before proceeding to
            the next.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The constant buffer or constant buffer sequence <code class="computeroutput"><span class="identifier">source</span></code>
            specifies memory where the data to be written is located. The operation
            shall always copy a buffer in the sequence completely before proceeding
            to the next.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The number of bytes copied from <code class="computeroutput"><span class="identifier">source</span></code> to <code class="computeroutput"><span class="identifier">dest</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> Where an overload accepts a template parameter
            <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code>,
            the overload shall not participate in overload resolution unless <code class="computeroutput"><span class="identifier">is_mutable_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">MutableBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true. Where an overload accepts
            a template parameter <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code>,
            the overload shall not participate in overload resolution unless <code class="computeroutput"><span class="identifier">is_const_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">ConstBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code> is true.
          </p></blockquote></div></div><div class="section" title="9.6.11.&#160;Buffer arithmetic"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_arithmetic"></a>9.6.11.&#160;Buffer arithmetic</h4></div></div></div><pre class="programlisting"><span class="identifier">mutable_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">mutable_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
            equivalent to
</p><pre class="programlisting"><span class="identifier">mutable_buffer</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)),</span>
  <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">const_buffer</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffer</span></code>
            equivalent to
</p><pre class="programlisting"><span class="identifier">const_buffer</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)),</span>
  <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">mutable_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">mutable_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">mutable_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            equivalent to
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)),</span>
  <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="keyword">const</span> <span class="identifier">const_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">const_buffers_1</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">const_buffers_1</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            equivalent to
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)),</span>
  <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">-</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">)));</span>
</pre><p>
          </p></blockquote></div></div><div class="section" title="9.6.12.&#160;Buffer creation functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer"></a>9.6.12.&#160;Buffer creation functions</h4></div></div></div><p>
          In the functions below, <code class="computeroutput"><span class="identifier">T</span></code>
          must be a <span class="emphasis"><em>POD type</em></span>.
        </p><p>
          For the function overloads below that accept an argument of type <code class="computeroutput"><span class="identifier">vector</span><span class="special">&lt;&gt;</span></code>,
          the buffer objects returned are invalidated by any vector operation that
          also invalidates all references, pointers and iterators referring to the
          elements in the sequence (C++ Std, [vector]).
        </p><p>
          For the function overloads below that accept an argument of type <code class="computeroutput"><span class="identifier">basic_string</span><span class="special">&lt;&gt;</span></code>,
          the buffer objects returned are invalidated according to the rules defined
          for invalidation of references, pointers and iterators referring to elements
          of the sequence (C++ Std, [string.require]).
        </p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">const_buffers_1</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">mutable_buffers_1</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">mutable_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">const_buffers_1</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">const_buffer</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">buffer_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">b</span><span class="special">),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">b</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">arr</span><span class="special">),</span>
  <span class="identifier">N</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">],</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">arr</span><span class="special">),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">N</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">])</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">arr</span><span class="special">),</span>
  <span class="identifier">N</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">(&amp;</span><span class="identifier">arr</span><span class="special">)[</span><span class="identifier">N</span><span class="special">],</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*&gt;(</span><span class="identifier">arr</span><span class="special">),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">N</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;&amp;</span> <span class="identifier">arr</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">arr</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">arr</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">vec</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">vec</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">vec</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">vec</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">str</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">mutable_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                           <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">mutable_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">mutable_buffers_1</span><span class="special">(</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">?</span> <span class="special">&amp;</span><span class="identifier">str</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">:</span> <span class="keyword">nullptr</span><span class="special">,</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                         <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="identifier">const_buffers_1</span></code>
            value equivalent to:
</p><pre class="programlisting"><span class="identifier">const_buffers_1</span><span class="special">(</span>
  <span class="identifier">str</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
  <span class="identifier">min</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">*</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
</pre><p>
          </p></blockquote></div></div><div class="section" title="9.6.13.&#160;Class template dynamic_vector_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.dynamic_vector_buffer"></a>9.6.13.&#160;Class template <code class="literal">dynamic_vector_buffer</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span></code>
          class template meets the requirements for <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements"><code class="computeroutput"><span class="identifier">DynamicBufferSequence</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">dynamic_vector_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>
        <span class="keyword">typedef</span> <span class="identifier">const_buffers_1</span> <span class="identifier">const_buffers_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">mutable_buffers_1</span> <span class="identifier">mutable_buffers_type</span><span class="special">;</span>

        <span class="comment">// constructors:</span>
        <span class="keyword">explicit</span> <span class="identifier">dynamic_vector_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">dynamic_vector_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span>
                              <span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">dynamic_vector_buffer</span><span class="special">(</span><span class="identifier">dynamic_vector_buffer</span><span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>

        <span class="comment">// members:</span>
        <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_buffers_type</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">mutable_buffers_type</span> <span class="identifier">prepare</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">commit</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">consume</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">size_t</span> <span class="identifier">size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="keyword">const</span> <span class="identifier">size_t</span> <span class="identifier">max_size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span></code>
          class template requires that <code class="computeroutput"><span class="identifier">T</span></code>
          is a <span class="emphasis"><em>POD type</em></span> and that <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span>
          <span class="special">==</span> <span class="number">1</span></code>.
        </p><div class="section" title="9.6.13.1.&#160;dynamic_vector_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_vector_buffer__constructors"></a>9.6.13.1.&#160;<code class="literal">dynamic_vector_buffer</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">dynamic_vector_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span></code>, binding <code class="computeroutput"><span class="identifier">vec_</span></code> to <code class="computeroutput"><span class="identifier">vec</span></code>,
              initializing <code class="computeroutput"><span class="identifier">size_</span></code>
              with <code class="computeroutput"><span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>,
              and initializing <code class="computeroutput"><span class="identifier">max_size_</span></code>
              with <code class="computeroutput"><span class="identifier">vec</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">dynamic_vector_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span>
                      <span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">maximum_size</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span></code>, binding <code class="computeroutput"><span class="identifier">vec_</span></code> to <code class="computeroutput"><span class="identifier">vec</span></code>,
              initializing <code class="computeroutput"><span class="identifier">size_</span></code>
              with <code class="computeroutput"><span class="identifier">vec</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>,
              and initializing <code class="computeroutput"><span class="identifier">max_size_</span></code>
              with <code class="computeroutput"><span class="identifier">maximum_size</span></code>.
            </p></blockquote></div></div><div class="section" title="9.6.13.2.&#160;dynamic_vector_buffer members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_vector_buffer__members"></a>9.6.13.2.&#160;<code class="literal">dynamic_vector_buffer</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">size_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">max_size_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">vec_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_type</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vec_</span><span class="special">,</span> <span class="identifier">size_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffers_type</span> <span class="identifier">prepare</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">n</span> <span class="special">&lt;=</span>
              <span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_</span>
              <span class="special">+</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">vec_</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">size_</span><span class="special">,</span>
              <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span>
              <span class="special">+</span> <span class="identifier">n</span>
              <span class="special">&gt;</span> <span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">commit</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs:<br>
</p><pre class="programlisting"><span class="identifier">size_</span> <span class="special">+=</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">vec_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">size_</span><span class="special">);</span>
<span class="identifier">vec_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">consume</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs:<br>
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">size_</span><span class="special">);</span>
<span class="identifier">vec_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">vec_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">vec_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">m</span><span class="special">);</span>
<span class="identifier">size_</span> <span class="special">-=</span> <span class="identifier">m</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div></div></div><div class="section" title="9.6.14.&#160;Class template dynamic_string_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.dynamic_string_buffer"></a>9.6.14.&#160;Class template <code class="literal">dynamic_string_buffer</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span></code>
          class template meets the requirements for <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements"><code class="computeroutput"><span class="identifier">DynamicBufferSequence</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">dynamic_string_buffer</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>
        <span class="keyword">typedef</span> <span class="identifier">const_buffers_1</span> <span class="identifier">const_buffers_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">mutable_buffers_1</span> <span class="identifier">mutable_buffers_type</span><span class="special">;</span>

        <span class="comment">// constructors:</span>
        <span class="keyword">explicit</span> <span class="identifier">dynamic_string_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">dynamic_string_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                              <span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">dynamic_string_buffer</span><span class="special">(</span><span class="identifier">dynamic_string_buffer</span><span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>

        <span class="comment">// members:</span>
        <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">const_buffers_type</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">mutable_buffers_type</span> <span class="identifier">prepare</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">commit</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">consume</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">size_t</span> <span class="identifier">size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="keyword">const</span> <span class="identifier">size_t</span> <span class="identifier">max_size_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span></code>
          class template requires that <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span></code>.
        </p><div class="section" title="9.6.14.1.&#160;dynamic_string_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_string_buffer__constructors"></a>9.6.14.1.&#160;<code class="literal">dynamic_string_buffer</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">dynamic_string_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span></code>, binding <code class="computeroutput"><span class="identifier">str_</span></code> to <code class="computeroutput"><span class="identifier">str</span></code>,
              initializing <code class="computeroutput"><span class="identifier">size_</span></code>
              with <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>,
              and initializing <code class="computeroutput"><span class="identifier">max_size_</span></code>
              with <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">dynamic_string_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span>
                      <span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">maximum_size</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span></code>, binding <code class="computeroutput"><span class="identifier">str_</span></code> to <code class="computeroutput"><span class="identifier">str</span></code>,
              initializing <code class="computeroutput"><span class="identifier">size_</span></code>
              with <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>,
              and initializing <code class="computeroutput"><span class="identifier">max_size_</span></code>
              with <code class="computeroutput"><span class="identifier">maximum_size</span></code>.
            </p></blockquote></div></div><div class="section" title="9.6.14.2.&#160;dynamic_string_buffer members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_string_buffer__members"></a>9.6.14.2.&#160;<code class="literal">dynamic_string_buffer</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">size_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">max_size_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">str_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">const_buffers_type</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">str_</span><span class="special">,</span> <span class="identifier">size_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">mutable_buffers_type</span> <span class="identifier">prepare</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">n</span> <span class="special">&lt;=</span>
              <span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs <code class="computeroutput"><span class="identifier">str</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_</span>
              <span class="special">+</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">str_</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">size_</span><span class="special">,</span>
              <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span>
              <span class="special">+</span> <span class="identifier">n</span>
              <span class="special">&gt;</span> <span class="identifier">max_size</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">commit</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs:<br>
</p><pre class="programlisting"><span class="identifier">size_</span> <span class="special">+=</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">str_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">size_</span><span class="special">);</span>
<span class="identifier">str_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">consume</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Performs:<br>
</p><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">size_</span><span class="special">);</span>
<span class="identifier">str_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
<span class="identifier">size_</span> <span class="special">-=</span> <span class="identifier">m</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div></div></div><div class="section" title="9.6.15.&#160;Dynamic buffer creation functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.dynamic_buffer"></a>9.6.15.&#160;Dynamic buffer creation functions</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">T</span></code>
            is a <span class="emphasis"><em>POD type</em></span> and <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">vec</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">vec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">T</span></code>
            is a <span class="emphasis"><em>POD type</em></span> and <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">dynamic_vector_buffer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">vec</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">str</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">dynamic_buffer</span><span class="special">(</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">CharT</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">dynamic_string_buffer</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.16.&#160;Class transfer_all"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_all"></a>9.6.16.&#160;Class <code class="literal">transfer_all</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">transfer_all</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class <code class="computeroutput"><span class="identifier">transfer_all</span></code>
          is a function object type for use as a <code class="computeroutput"><span class="identifier">CompletionCondition</span></code>
          argument to <a class="link" href="#functions.read" title="9.6.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="9.6.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="9.6.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="9.6.22.&#160;Asynchronous write operations">asynchronous write</a>
          operations.
        </p><pre class="programlisting"><span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>, an unspecified non-zero value.
            Otherwise <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.17.&#160;Class transfer_at_least"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_at_least"></a>9.6.17.&#160;Class <code class="literal">transfer_at_least</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">transfer_at_least</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">explicit</span> <span class="identifier">transfer_at_least</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">m</span><span class="special">);</span>
        <span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">size_t</span> <span class="identifier">minimum_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class <code class="computeroutput"><span class="identifier">transfer_at_least</span></code>
          is a function object type for use as a <code class="computeroutput"><span class="identifier">CompletionCondition</span></code>
          argument to <a class="link" href="#functions.read" title="9.6.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="9.6.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="9.6.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="9.6.22.&#160;Asynchronous write operations">asynchronous write</a>
          operations.
        </p><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">transfer_at_least</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">m</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">minimum_</span>
            <span class="special">==</span> <span class="identifier">m</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span> <span class="special">&amp;&amp;</span>
            <span class="identifier">n</span> <span class="special">&lt;</span>
            <span class="identifier">minimum_</span></code>, an unspecified non-zero
            value. Otherwise <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.18.&#160;Class transfer_exactly"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_exactly"></a>9.6.18.&#160;Class <code class="literal">transfer_exactly</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">transfer_exactly</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">explicit</span> <span class="identifier">transfer_exactly</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">e</span><span class="special">);</span>
        <span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">size_t</span> <span class="identifier">exact_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class <code class="computeroutput"><span class="identifier">transfer_exactly</span></code>
          is a function object type for use as a <code class="computeroutput"><span class="identifier">CompletionCondition</span></code>
          argument to <a class="link" href="#functions.read" title="9.6.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="9.6.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="9.6.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="9.6.22.&#160;Asynchronous write operations">asynchronous write</a>
          operations.
        </p><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">transfer_exactly</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">exact_</span>
            <span class="special">==</span> <span class="identifier">e</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span> <span class="special">&amp;&amp;</span>
            <span class="identifier">n</span> <span class="special">&lt;</span>
            <span class="identifier">exact_</span></code>, the result of <code class="computeroutput"><span class="identifier">min</span><span class="special">(</span><span class="identifier">exact_</span> <span class="special">-</span>
            <span class="identifier">n</span><span class="special">,</span>
            <span class="identifier">N</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">N</span></code> is an unspecified
            non-zero value. Otherwise <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.19.&#160;Synchronous read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.read"></a>9.6.19.&#160;Synchronous read operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
              <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
              <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            A <a class="link" href="#requirements.synchronous_read_operations" title="9.6.2.6.&#160;Requirements on synchronous read operations">synchronous
            read operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Reads data from the <a class="link" href="#requirements.sync_read_stream" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements">buffer-oriented
            synchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more calls to the stream's <code class="computeroutput"><span class="identifier">read_some</span></code>
            member function.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each call
            to the stream's <code class="computeroutput"><span class="identifier">read_some</span></code>
            member function. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code>
            value from the most recent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call, and the total number of bytes transferred in the synchronous read
            operation so far. The function object return value specifies the maximum
            number of bytes to be read on the subsequent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call. Overloads where a completion condition is not specified behave
            as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The synchronous read operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the total number of bytes transferred is equal to <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On return, <code class="computeroutput"><span class="identifier">ec</span></code> contains
            the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The total number of bytes transferred in
            the synchronous read operation.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_mutable_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">MutableBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">read</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Reads data from the <a class="link" href="#requirements.sync_read_stream" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements">synchronous
            read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more calls to the stream's <code class="computeroutput"><span class="identifier">read_some</span></code>
            member function.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is placed into the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable buffer sequence</a>
            is obtained prior to each <code class="computeroutput"><span class="identifier">read_some</span></code>
            call using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">prepare</span><span class="special">(</span><span class="identifier">N</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">N</span></code> is an unspecified
            value such that <code class="computeroutput"><span class="identifier">N</span> <span class="special">&lt;=</span>
            <span class="identifier">max_size</span><span class="special">()</span>
            <span class="special">-</span> <span class="identifier">size</span><span class="special">()</span></code>. [<span class="emphasis"><em>Note:</em></span> Implementations
            are encouraged to use <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code> when determining <code class="computeroutput"><span class="identifier">N</span></code>,
            to minimize the number of <code class="computeroutput"><span class="identifier">read_some</span></code>
            calls performed on the stream. &#8212;<span class="emphasis"><em>end note</em></span>] After each
            <code class="computeroutput"><span class="identifier">read_some</span></code> call, the implementation
            performs <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">commit</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the return
            value from <code class="computeroutput"><span class="identifier">read_some</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each call
            to the stream's <code class="computeroutput"><span class="identifier">read_some</span></code>
            member function. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code>
            value from the most recent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call, and the total number of bytes transferred in the synchronous read
            operation so far. The function object return value specifies the maximum
            number of bytes to be read on the subsequent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call. Overloads where a completion condition is not specified behave
            as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The synchronous read operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On return, <code class="computeroutput"><span class="identifier">ec</span></code> contains
            the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent <code class="computeroutput"><span class="identifier">read_some</span></code>
            call.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The total number of bytes transferred in
            the synchronous read operation.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_dynamic_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">DynamicBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.6.20.&#160;Asynchronous read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_read"></a>9.6.20.&#160;Asynchronous read operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                    <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                    <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                    <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            An <a class="link" href="#requirements.asynchronous_read_operations" title="9.6.2.7.&#160;Requirements on asynchronous read operations">asynchronous
            read operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
            <span class="identifier">ec</span><span class="special">,</span>
            <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
            read data from the <a class="link" href="#requirements.async_read_stream" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements">buffer-oriented
            asynchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more asynchronous operations on the stream using
            the stream's <code class="computeroutput"><span class="identifier">async_read_some</span></code>
            member function (henceforth referred to as asynchronous read_some operations).
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each asynchronous
            read_some operation. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code> value from the most recent
            asynchronous read_some operation, and the total number of bytes transferred
            in the asynchronous read operation so far. The function object return
            value specifies the maximum number of bytes to be read on the subsequent
            asynchronous read_some operation. Overloads where a completion condition
            is not specified behave as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The asynchronous read operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the total number of bytes transferred is equal to <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The program must ensure the <code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>
            object <code class="computeroutput"><span class="identifier">stream</span></code> is valid
            until the handler for the asynchronous operation is invoked.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On completion of the asynchronous operation, <code class="computeroutput"><span class="identifier">ec</span></code>
            is the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent asynchronous read_some operation, and <code class="computeroutput"><span class="identifier">n</span></code> is the total number of bytes transferred.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_mutable_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">MutableBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                    <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                    <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
            operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
            <span class="identifier">ec</span><span class="special">,</span>
            <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
            read data from the <a class="link" href="#requirements.async_read_stream" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements">buffer-oriented
            asynchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing one or more asynchronous read_some operations on the stream.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is placed into the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable buffer sequence</a>
            is obtained prior to each <code class="computeroutput"><span class="identifier">async_read_some</span></code>
            call using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">prepare</span><span class="special">(</span><span class="identifier">N</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">N</span></code> is an unspecified
            value such that <code class="computeroutput"><span class="identifier">N</span> <span class="special">&lt;=</span>
            <span class="identifier">max_size</span><span class="special">()</span>
            <span class="special">-</span> <span class="identifier">size</span><span class="special">()</span></code>. [<span class="emphasis"><em>Note:</em></span> Implementations
            are encouraged to use <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code> when determining <code class="computeroutput"><span class="identifier">N</span></code>,
            to minimize the number of asynchronous read_some operations performed
            on the stream. &#8212;<span class="emphasis"><em>end note</em></span>] After the completion of
            each asynchronous read_some operation, the implementation performs <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">commit</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the value
            passed to the asynchronous read_some operation's completion handler.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each asynchronous
            read_some operation. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code> value from the most recent
            asynchronous read_some operation, and the total number of bytes transferred
            in the asynchronous read operation so far. The function object return
            value specifies the maximum number of bytes to be read on the subsequent
            asynchronous read_some operation. Overloads where a completion condition
            is not specified behave as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The asynchronous read operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The program must ensure both the <code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>
            object <code class="computeroutput"><span class="identifier">stream</span></code> and the
            memory associated with the dynamic buffer sequence <code class="computeroutput"><span class="identifier">b</span></code>
            are valid until the handler for the asynchronous operation is invoked.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On completion of the asynchronous operation, <code class="computeroutput"><span class="identifier">ec</span></code>
            is the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent asynchronous read_some operation, and <code class="computeroutput"><span class="identifier">n</span></code> is the total number of bytes transferred.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_dynamic_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">DynamicBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.6.21.&#160;Synchronous write operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.write"></a>9.6.21.&#160;Synchronous write operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
               <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
               <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                 <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            A <a class="link" href="#requirements.synchronous_write_operations" title="9.6.2.8.&#160;Requirements on synchronous write operations">synchronous
            write operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Writes data to the <a class="link" href="#requirements.sync_write_stream" title="9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements">buffer-oriented
            synchronous write stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more calls to the stream's <code class="computeroutput"><span class="identifier">write_some</span></code>
            member function.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each call
            to the stream's <code class="computeroutput"><span class="identifier">write_some</span></code>
            member function. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code>
            value from the most recent <code class="computeroutput"><span class="identifier">write_some</span></code>
            call, and the total number of bytes transferred in the synchronous write
            operation so far. The function object return value specifies the maximum
            number of bytes to be write on the subsequent <code class="computeroutput"><span class="identifier">write_some</span></code>
            call. Overloads where a completion condition is not specified behave
            as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The synchronous write operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the total number of bytes transferred is equal to <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On return, <code class="computeroutput"><span class="identifier">ec</span></code> contains
            the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent <code class="computeroutput"><span class="identifier">write_some</span></code>
            call.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The total number of bytes transferred in
            the synchronous write operation.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_const_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">ConstBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
               <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                 <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                 <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">&gt;</span>
    <span class="identifier">size_t</span> <span class="identifier">write</span><span class="special">(</span><span class="identifier">SyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                 <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                 <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                 <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Writes data to the <a class="link" href="#requirements.sync_write_stream" title="9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements">synchronous
            write stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more calls to the stream's <code class="computeroutput"><span class="identifier">write_some</span></code>
            member function.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is written from the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant buffer sequence</a>
            is obtained using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span></code>.
            After the data has been written to the stream, the implementation performs
            <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">consume</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the number
            of bytes successfully written.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called after each call to
            the stream's <code class="computeroutput"><span class="identifier">write_some</span></code>
            member function. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code>
            value from the most recent <code class="computeroutput"><span class="identifier">write_some</span></code>
            call, and the total number of bytes transferred in the synchronous write
            operation so far. Overloads where a completion condition is not specified
            behave as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The synchronous write operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On return, <code class="computeroutput"><span class="identifier">ec</span></code> contains
            the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent <code class="computeroutput"><span class="identifier">write_some</span></code>
            call.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The total number of bytes transferred in
            the synchronous write operation.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_dynamic_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">DynamicBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.6.22.&#160;Asynchronous write operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_write"></a>9.6.22.&#160;Asynchronous write operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            An <a class="link" href="#requirements.asynchronous_write_operations" title="9.6.2.9.&#160;Requirements on asynchronous write operations">asynchronous
            write operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
            <span class="identifier">ec</span><span class="special">,</span>
            <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
            write data to the <a class="link" href="#requirements.async_write_stream" title="9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements">buffer-oriented
            asynchronous write stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more asynchronous operations on the stream using
            the stream's <code class="computeroutput"><span class="identifier">async_write_some</span></code>
            member function (henceforth referred to as asynchronous write_some operations).
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each asynchronous
            write_some operation. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code> value from the most recent
            asynchronous write_some operation, and the total number of bytes transferred
            in the asynchronous write operation so far. The function object return
            value specifies the maximum number of bytes to be write on the subsequent
            asynchronous write_some operation. Overloads where a completion condition
            is not specified behave as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The asynchronous write operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the total number of bytes transferred is equal to <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The program must ensure the <code class="computeroutput"><span class="identifier">AsyncWriteStream</span></code>
            object <code class="computeroutput"><span class="identifier">stream</span></code> is valid
            until the handler for the asynchronous operation is invoked.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On completion of the asynchronous operation, <code class="computeroutput"><span class="identifier">ec</span></code>
            is the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent asynchronous write_some operation, and <code class="computeroutput"><span class="identifier">n</span></code> is the total number of bytes transferred.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_const_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">ConstBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_write</span><span class="special">(</span><span class="identifier">AsyncWriteStream</span><span class="special">&amp;</span> <span class="identifier">stream</span><span class="special">,</span>
                     <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                     <span class="identifier">CompletionCondition</span> <span class="identifier">completion_condition</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
            operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
            <span class="identifier">ec</span><span class="special">,</span>
            <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
            write data to the <a class="link" href="#requirements.async_write_stream" title="9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements">buffer-oriented
            asynchronous write stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more asynchronous write_some operations on the
            stream.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is written from the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.const_buffers" title="9.6.2.4.&#160;Constant buffer sequence requirements">constant buffer sequence</a>
            is obtained using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span></code>.
            After the data has been written to the stream, the implementation performs
            <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">consume</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the number
            of bytes successfully written.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The <code class="computeroutput"><span class="identifier">completion_condition</span></code>
            parameter specifies a function object to be called prior to each asynchronous
            write_some operation. The function object is passed the <code class="computeroutput"><span class="identifier">error_code</span></code> value from the most recent
            asynchronous write_some operation, and the total number of bytes transferred
            in the asynchronous write operation so far. The function object return
            value specifies the maximum number of bytes to be write on the subsequent
            asynchronous write_some operation. Overloads where a completion condition
            is not specified behave as if called with an object of class <code class="computeroutput"><span class="identifier">transfer_all</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The asynchronous write operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the completion condition returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The program must ensure both the <code class="computeroutput"><span class="identifier">AsyncWriteStream</span></code>
            object <code class="computeroutput"><span class="identifier">stream</span></code> and the
            memory associated with the dynamic buffer sequence <code class="computeroutput"><span class="identifier">b</span></code>
            are valid until the handler for the asynchronous operation is invoked.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On completion of the asynchronous operation, <code class="computeroutput"><span class="identifier">ec</span></code>
            is the <code class="computeroutput"><span class="identifier">error_code</span></code> value
            from the most recent asynchronous write_some operation, and <code class="computeroutput"><span class="identifier">n</span></code> is the total number of bytes transferred.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This function shall not participate in
            overload resolution unless <code class="computeroutput"><span class="identifier">is_dynamic_buffer_sequence</span><span class="special">&lt;</span><span class="identifier">DynamicBufferSequence</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is true.
          </p></blockquote></div></div><div class="section" title="9.6.23.&#160;Synchronous delimited read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.read_until"></a>9.6.23.&#160;Synchronous delimited read operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_until</span><span class="special">(</span><span class="identifier">SyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Reads data from the <a class="link" href="#requirements.sync_read_stream" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements">buffer-oriented
            synchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more calls to the stream's <code class="computeroutput"><span class="identifier">read_some</span></code>
            member function, until the input sequence of the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>
            contains the specified delimiter <code class="computeroutput"><span class="identifier">delim</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is placed into the dynamic buffer sequence object <code class="computeroutput"><span class="identifier">b</span></code>. A <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable
            buffer sequence</a> is obtained prior to each <code class="computeroutput"><span class="identifier">read_some</span></code>
            call using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">prepare</span><span class="special">(</span><span class="identifier">N</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">N</span></code> is an unspecified
            value such that <code class="computeroutput"><span class="identifier">N</span> <span class="special">&lt;=</span>
            <span class="identifier">max_size</span><span class="special">()</span>
            <span class="special">-</span> <span class="identifier">size</span><span class="special">()</span></code>. [<span class="emphasis"><em>Note:</em></span> Implementations
            are encouraged to use <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code> when determining <code class="computeroutput"><span class="identifier">N</span></code>,
            to minimize the number of <code class="computeroutput"><span class="identifier">read_some</span></code>
            calls performed on the stream. &#8212;<span class="emphasis"><em>end note</em></span>] After each
            <code class="computeroutput"><span class="identifier">read_some</span></code> call, the implementation
            performs <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">commit</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the return
            value from <code class="computeroutput"><span class="identifier">read_some</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The synchronous read_until operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the input sequence of <code class="computeroutput"><span class="identifier">b</span></code>
            contains the delimiter <code class="computeroutput"><span class="identifier">delim</span></code>;
            or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; an synchronous read_some operation fails.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On exit, if the input sequence of <code class="computeroutput"><span class="identifier">b</span></code>
            contains the delimiter, <code class="computeroutput"><span class="identifier">ec</span></code>
            is set such that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>
            is true. Otherwise, if <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>,
            <code class="computeroutput"><span class="identifier">ec</span></code> is set such that
            <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
            <span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>. If <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>,
            <code class="computeroutput"><span class="identifier">ec</span></code> contains the <code class="computeroutput"><span class="identifier">error_code</span></code> from the most recent <code class="computeroutput"><span class="identifier">read_some</span></code> call.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The number of bytes in the input sequence
            of <code class="computeroutput"><span class="identifier">b</span></code> up to and including
            the delimiter, if present. Otherwise returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div><div class="section" title="9.6.24.&#160;Asynchronous delimited read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_read_until"></a>9.6.24.&#160;Asynchronous delimited read operations</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                          <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">delim</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBufferSequence</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">AsyncReadStream</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                          <span class="identifier">DynamicBufferSequence</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">delim</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
            operation</a>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
            <span class="identifier">ec</span><span class="special">,</span>
            <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
            read data from the <a class="link" href="#requirements.async_read_stream" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements">buffer-oriented
            asynchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by performing zero or more asynchronous read_some operations on the stream,
            until the input sequence of the <a class="link" href="#requirements.dynamic_buffers" title="9.6.2.5.&#160;Dynamic buffer sequence requirements">dynamic
            buffer sequence</a> object <code class="computeroutput"><span class="identifier">b</span></code>
            contains the specified delimiter <code class="computeroutput"><span class="identifier">delim</span></code>.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            Data is placed into the dynamic buffer sequence object <code class="computeroutput"><span class="identifier">b</span></code>. A <a class="link" href="#requirements.mutable_buffers" title="9.6.2.2.&#160;Mutable buffer sequence requirements">mutable
            buffer sequence</a> is obtained prior to each <code class="computeroutput"><span class="identifier">async_read_some</span></code>
            call using <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">prepare</span><span class="special">(</span><span class="identifier">N</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">N</span></code> is an unspecified
            value such that <code class="computeroutput"><span class="identifier">N</span> <span class="special">&lt;=</span>
            <span class="identifier">max_size</span><span class="special">()</span>
            <span class="special">-</span> <span class="identifier">size</span><span class="special">()</span></code>. [<span class="emphasis"><em>Note:</em></span> Implementations
            are encouraged to use <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code> when determining <code class="computeroutput"><span class="identifier">N</span></code>,
            to minimize the number of asynchronous read_some operations performed
            on the stream. &#8212;<span class="emphasis"><em>end note</em></span>] After the completion of
            each asynchronous read_some operation, the implementation performs <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">commit</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>,
            where <code class="computeroutput"><span class="identifier">n</span></code> is the value
            passed to the asynchronous read_some operation's completion handler.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The asynchronous read_until operation continues until:
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; the input sequence of <code class="computeroutput"><span class="identifier">b</span></code>
            contains the delimiter <code class="computeroutput"><span class="identifier">delim</span></code>;
            or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>; or
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            &#8212; an asynchronous read_some operation fails.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The program must ensure both the <code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>
            object <code class="computeroutput"><span class="identifier">stream</span></code> and the
            memory associated with the dynamic buffer sequence <code class="computeroutput"><span class="identifier">b</span></code>
            are valid until the handler for the asynchronous operation is invoked.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            On completion of the asynchronous operation, if the input sequence of
            <code class="computeroutput"><span class="identifier">b</span></code> contains the delimiter,
            <code class="computeroutput"><span class="identifier">ec</span></code> is set such that
            <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code>
            is true. Otherwise, if <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>,
            <code class="computeroutput"><span class="identifier">ec</span></code> is set such that
            <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
            <span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>. If <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code>,
            <code class="computeroutput"><span class="identifier">ec</span></code> contains the <code class="computeroutput"><span class="identifier">error_code</span></code> from the most recent asynchronous
            read_some operation. <code class="computeroutput"><span class="identifier">n</span></code>
            shall contain the number of bytes in the input sequence of <code class="computeroutput"><span class="identifier">b</span></code> up to and including the delimiter,
            if present, otherwise <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div></div><div class="section" title="9.7.&#160;Sockets"><div class="titlepage"><div><div><h3 class="title"><a name="network.sockets"></a>9.7.&#160;Sockets</h3></div></div></div><div class="section" title="9.7.1.&#160;Header &lt;experimental/socket&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_socket___synopsis"></a>9.7.1.&#160;Header <code class="literal">&lt;experimental/socket&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">socket_errc</span> <span class="special">{</span>
        <span class="identifier">already_open</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span><span class="special">,</span>
        <span class="identifier">not_found</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span>
      <span class="special">};</span>

      <span class="keyword">const</span> <span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">socket_category</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">socket_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
      <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">socket_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

      <span class="comment">// Sockets:</span>

      <span class="keyword">class</span> <a class="link" href="#classes.socket_base" title="9.7.4.&#160;Class socket_base">socket_base</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.basic_socket" title="9.7.8.&#160;Class template basic_socket">basic_socket</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.basic_datagram_socket" title="9.7.9.&#160;Class template basic_datagram_socket">basic_datagram_socket</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.basic_stream_socket" title="9.7.10.&#160;Class template basic_stream_socket">basic_stream_socket</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.basic_socket_acceptor" title="9.7.11.&#160;Class template basic_socket_acceptor">basic_socket_acceptor</a><span class="special">;</span>

      <span class="comment">// Socket streams:</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">WaitTraits</span> <span class="special">=</span> <span class="identifier">wait_traits</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">&gt;&gt;</span>
          <span class="keyword">class</span> <a class="link" href="#classes.basic_socket_streambuf" title="9.8.1.&#160;Class template basic_socket_streambuf">basic_socket_streambuf</a><span class="special">;</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">WaitTraits</span> <span class="special">=</span> <span class="identifier">wait_traits</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">&gt;&gt;</span>
          <span class="keyword">class</span> <a class="link" href="#classes.basic_socket_iostream" title="9.8.2.&#160;Class template basic_socket_iostream">basic_socket_iostream</a><span class="special">;</span>

      // <a class="link" href="#functions.connect" title="9.9.&#160;Synchronous connect operations">synchronous connect operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                              <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                              <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                              <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">);</span>
      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                              <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                              <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

      // <a class="link" href="#functions.async_connect" title="9.10.&#160;Asynchronous connect operations">asynchronous connect operations</a>:

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                           <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                           <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                           <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                             <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                             <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span>
        <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                             <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                             <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>

  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special">&lt;</span>
    <span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">socket_errc</span><span class="special">&gt;</span>
      <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>

<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.7.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.sockets_requirements"></a>9.7.2.&#160;Requirements</h4></div></div></div><div class="section" title="9.7.2.1.&#160;Native handles"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.native_handles"></a>9.7.2.1.&#160;Native handles</h5></div></div></div><p>
            Several classes described in this Clause have a member type <code class="computeroutput"><span class="identifier">native_handle_type</span></code>, a member function
            <code class="computeroutput"><span class="identifier">native_handle</span></code>, and member
            functions that accept arguments of type <code class="computeroutput"><span class="identifier">native_handle_type</span></code>.
            The presence of these members and their semantics is implementation-defined.
          </p><p>
            [<span class="emphasis"><em>Note:</em></span> These members allow implementations to provide
            access to their implementation details. Their names are specified to
            facilitate portable compile-time detection. Actual use of these members
            is inherently non-portable. For operating systems that are based on
            <span class="emphasis"><em>POSIX</em></span>, implementations are encouraged to define
            the <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
            for sockets as <code class="computeroutput"><span class="keyword">int</span></code>, representing
            the native file descriptor associated with the socket. &#8212;<span class="emphasis"><em>end
            note</em></span>]
          </p></div><div class="section" title="9.7.2.2.&#160;Extensibility"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.extensibility"></a>9.7.2.2.&#160;Extensibility</h5></div></div></div><p>
            This clause defines an optional level of conformance, in the form of
            additional member functions on types that satisfy <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements"><code class="computeroutput"><span class="identifier">Protocol</span></code></a>, <a class="link" href="#requirements.endpoint" title="9.7.2.3.&#160;Endpoint requirements"><code class="computeroutput"><span class="identifier">Endpoint</span></code></a>, <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>, <a class="link" href="#requirements.gettable_socket_option" title="9.7.2.5.&#160;Gettable socket option requirements"><code class="computeroutput"><span class="identifier">GettableSocketOption</span></code></a>
            or <a class="link" href="#requirements.io_control_command" title="9.7.2.7.&#160;I/O control command requirements"><code class="computeroutput"><span class="identifier">IoControlCommand</span></code></a>
            requirements.
          </p><p>
            [<span class="emphasis"><em>Note:</em></span> When the additional member functions are
            available, C++ programs may extend the library to add support for other
            protocols and socket options. &#8212;<span class="emphasis"><em>end note</em></span>]
          </p><p>
            An implementation's level of conformance shall be documented.
          </p><p>
            [<span class="emphasis"><em>Note:</em></span> Implementations are encouraged to provide
            the additional member functions, where possible. It is intended that
            <span class="emphasis"><em>POSIX</em></span> and <span class="emphasis"><em>Windows</em></span> implementations
            will provide them. &#8212;<span class="emphasis"><em>end note</em></span>]
          </p><p>
            For the purposes of this clause, implementations that provide the additional
            member functions are known as <span class="emphasis"><em>extensible implementations</em></span>.
          </p></div><div class="section" title="9.7.2.3.&#160;Endpoint requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.endpoint"></a>9.7.2.3.&#160;Endpoint requirements</h5></div></div></div><p>
            An endpoint must meet the requirements of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            types (C++ Std, 20.1.3), and the requirements of <code class="computeroutput"><span class="identifier">Assignable</span></code>
            types (C++ Std, 23.1).
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes an endpoint class, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.endpoint.t0"></a><p class="title"><b>Table&#160;19.&#160;Endpoint requirements</b></p><div class="table-contents"><table class="table" summary="Endpoint requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">protocol_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      type meeting <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements">protocol</a>
                      requirements
                    </p>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">;</span></code>
                    </p>
                  </td><td>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">protocol_type</span></code>
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes an endpoint class, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">s</span></code> denotes a size in bytes,
            and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.endpoint.t1"></a><p class="title"><b>Table&#160;20.&#160;Endpoint requirements for extensible implementations</b></p><div class="table-contents"><table class="table" summary="Endpoint requirements for extensible implementations"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      a pointer
                    </p>
                  </td><td>
                    <p>
                      Returns a pointer suitable for passing as the <span class="emphasis"><em>address</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
                      and <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>.
                      The implementation shall perform a <code class="computeroutput"><span class="keyword">reinterpret_cast</span></code>
                      on the pointer to convert it to <code class="computeroutput"><span class="identifier">sockaddr</span><span class="special">*</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">u</span>
                      <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      a pointer
                    </p>
                  </td><td>
                    <p>
                      Returns a pointer suitable for passing as the <span class="emphasis"><em>address</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>,
                      or as the <span class="emphasis"><em>dest_addr</em></span> argument to <span class="emphasis"><em>POSIX</em></span>
                      functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendto</span><span class="special">()</span></code></a>.
                      The implementation shall perform a <code class="computeroutput"><span class="keyword">reinterpret_cast</span></code>
                      on the pointer to convert it to <code class="computeroutput"><span class="keyword">const</span>
                      <span class="identifier">sockaddr</span><span class="special">*</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>address_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>,
                      or as the <span class="emphasis"><em>dest_len</em></span> argument to <span class="emphasis"><em>POSIX</em></span>
                      functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendto</span><span class="special">()</span></code></a>,
                      after appropriate integer conversion has been performed.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      post: <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span>
                      <span class="special">==</span> <span class="identifier">s</span></code><br>
                      Passed the value contained in the <span class="emphasis"><em>address_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
                      and <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>,
                      after successful completion of the function. Permitted to throw
                      an exception if the protocol associated with the endpoint object
                      <code class="computeroutput"><span class="identifier">a</span></code> does not
                      support the specified size.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>address_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> functions such as <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
                      <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
                      and <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>,
                      after appropriate integer conversion has been performed.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.7.2.4.&#160;Protocol requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.protocol"></a>9.7.2.4.&#160;Protocol requirements</h5></div></div></div><p>
            A protocol must meet the requirements of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            types (C++ Std, 20.1.3), and the requirements of <code class="computeroutput"><span class="identifier">Assignable</span></code>
            types (C++ Std, 23.1).
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a protocol class, and <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of <code class="computeroutput"><span class="identifier">X</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.protocol.t0"></a><p class="title"><b>Table&#160;21.&#160;Protocol requirements</b></p><div class="table-contents"><table class="table" summary="Protocol requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">endpoint</span></code>
                    </p>
                  </td><td>
                    <p>
                      type meeting <a class="link" href="#requirements.endpoint" title="9.7.2.3.&#160;Endpoint requirements">endpoint</a>
                      requirements
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a protocol class, and <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of <code class="computeroutput"><span class="identifier">X</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.protocol.t1"></a><p class="title"><b>Table&#160;22.&#160;Protocol requirements for extensible implementations</b></p><div class="table-contents"><table class="table" summary="Protocol requirements for extensible implementations"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>domain</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">type</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>type</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>protocol</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.7.2.5.&#160;Gettable socket option requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.gettable_socket_option"></a>9.7.2.5.&#160;Gettable socket option requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a socket option class, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">p</span></code> denotes a value that
            meets the <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements">protocol</a> requirements,
            and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.gettable_socket_option.t0"></a><p class="title"><b>Table&#160;23.&#160;GettableSocketOption requirements for extensible implementations</b></p><div class="table-contents"><table class="table" summary="GettableSocketOption requirements for extensible implementations"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>level</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>option_name</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      a pointer, convertible to <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a pointer suitable for passing as the <span class="emphasis"><em>option_value</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>option_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
                      (or equivalent), after appropriate integer conversion has been
                      performed.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span>
                      <span class="identifier">s</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                  </td><td>
                    <p>
                      post: <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span>
                      <span class="special">==</span> <span class="identifier">s</span></code>.<br>
                      Passed the value contained in the <span class="emphasis"><em>option_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
                      (or equivalent) after successful completion of the function.
                      Permitted to throw an exception if the socket option object
                      <code class="computeroutput"><span class="identifier">a</span></code> does not
                      support the specified size.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.7.2.6.&#160;Settable socket option requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.settable_socket_option"></a>9.7.2.6.&#160;Settable socket option requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a socket option class, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">p</span></code> denotes a value that
            meets the <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements">protocol</a> requirements,
            and <code class="computeroutput"><span class="identifier">u</span></code> denotes an identifier.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.settable_socket_option.t0"></a><p class="title"><b>Table&#160;24.&#160;SettableSocketOption requirements for extensible implementations</b></p><div class="table-contents"><table class="table" summary="SettableSocketOption requirements for extensible implementations"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>level</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>option_name</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">u</span>
                      <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      a pointer, convertible to <code class="computeroutput"><span class="keyword">const</span>
                      <span class="keyword">void</span><span class="special">*</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a pointer suitable for passing as the <span class="emphasis"><em>option_value</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">size_t</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>option_len</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
                      (or equivalent), after appropriate integer conversion has been
                      performed.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.7.2.7.&#160;I/O control command requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.io_control_command"></a>9.7.2.7.&#160;I/O control command requirements</h5></div></div></div><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of an I/O control command class.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.io_control_command.t0"></a><p class="title"><b>Table&#160;25.&#160;IoControlCommand requirements for extensible implementations</b></p><div class="table-contents"><table class="table" summary="IoControlCommand requirements for extensible implementations"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">name</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">int</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns a value suitable for passing as the <span class="emphasis"><em>request</em></span>
                      argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/ioctl.html" target="_top"><code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code></a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span></code>
                    </p>
                  </td><td>
                    <p>
                      a pointer, convertible to <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span></code>
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="9.7.3.&#160;Error codes"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_errc"></a>9.7.3.&#160;Error codes</h4></div></div></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">socket_category</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A reference to an object of a type derived
            from class error_category.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The object&#8217;s <code class="computeroutput"><span class="identifier">default_error_condition</span></code>
            and <code class="computeroutput"><span class="identifier">equivalent</span></code> virtual
            functions shall behave as specified for the class <code class="computeroutput"><span class="identifier">error_category</span></code>.
            The object&#8217;s <code class="computeroutput"><span class="identifier">name</span></code> virtual
            function shall return a pointer to the string <code class="computeroutput"><span class="string">"socket"</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">socket_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">socket_category</span><span class="special">())</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">socket_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">socket_category</span><span class="special">())</span></code>.
          </p></blockquote></div></div><div class="section" title="9.7.4.&#160;Class socket_base"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base"></a>9.7.4.&#160;Class <code class="literal">socket_base</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">socket_base</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">broadcast</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">debug</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">do_not_route</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">keep_alive</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__linger" title="9.7.7.&#160;Class socket_base::linger">linger</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">out_of_band_inline</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">receive_buffer_size</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">receive_low_watermark</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">reuse_address</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">send_buffer_size</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">send_low_watermark</a><span class="special">;</span>

        <span class="keyword">typedef</span> <span class="emphasis"><em><span class="bold"><strong>T1</strong></span></em></span> <span class="identifier">shutdown_type</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">shutdown_type</span> <span class="identifier">shutdown_receive</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">shutdown_type</span> <span class="identifier">shutdown_send</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">shutdown_type</span> <span class="identifier">shutdown_both</span><span class="special">;</span>

        <span class="keyword">typedef</span> <span class="emphasis"><em><span class="bold"><strong>T2</strong></span></em></span> <span class="identifier">wait_type</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">wait_type</span> <span class="identifier">wait_read</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">wait_type</span> <span class="identifier">wait_write</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">wait_type</span> <span class="identifier">wait_error</span><span class="special">;</span>

        <span class="keyword">typedef</span> <span class="emphasis"><em><span class="bold"><strong>T3</strong></span></em></span> <span class="identifier">message_flags</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">message_flags</span> <span class="identifier">message_peek</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">message_flags</span> <span class="identifier">message_out_of_band</span><span class="special">;</span>
        <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">message_flags</span> <span class="identifier">message_do_not_route</span><span class="special">;</span>

        <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">max_connections</span><span class="special">;</span>

      <span class="keyword">protected</span><span class="special">:</span>
        <span class="identifier">socket_base</span><span class="special">();</span>
        <span class="special">~</span><span class="identifier">socket_base</span><span class="special">();</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">socket_base</span></code> defines several
          member types:
        </p><p>
          &#8212; socket option classes <code class="computeroutput"><span class="identifier">broadcast</span></code>,
          <code class="computeroutput"><span class="identifier">debug</span></code>, <code class="computeroutput"><span class="identifier">do_not_route</span></code>,
          <code class="computeroutput"><span class="identifier">keep_alive</span></code>, <code class="computeroutput"><span class="identifier">linger</span></code>, <code class="computeroutput"><span class="identifier">out_of_band_inline</span></code>,
          <code class="computeroutput"><span class="identifier">receive_buffer_size</span></code>, <code class="computeroutput"><span class="identifier">receive_low_watermark</span></code>, <code class="computeroutput"><span class="identifier">reuse_address</span></code>, <code class="computeroutput"><span class="identifier">send_buffer_size</span></code>,
          and <code class="computeroutput"><span class="identifier">send_low_watermark</span></code>;
        </p><p>
          &#8212; an enumerated type, <code class="computeroutput"><span class="identifier">shutdown_type</span></code>;
        </p><p>
          &#8212; an enumerated type, <code class="computeroutput"><span class="identifier">wait_type</span></code>;
        </p><p>
          &#8212; a bitmask type, <code class="computeroutput"><span class="identifier">message_flags</span></code>.
        </p><p>
          The value <code class="computeroutput"><span class="identifier">max_connections</span></code>
          contains the implementation-defined limit on the length of the queue of
          pending incoming connections.
        </p></div><div class="section" title="9.7.5.&#160;Boolean socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__bool_socket_options"></a>9.7.5.&#160;Boolean socket options</h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">broadcast</span></code>, <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">debug</span></code>,
          <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">do_not_route</span></code>, <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">keep_alive</span></code>,
          <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">out_of_band_inline</span></code> and <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">reuse_address</span></code> classes are boolean socket
          options.
        </p><p>
          Boolean socket option classes satisfy the requirements for <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>, <code class="computeroutput"><span class="identifier">Assignable</span></code>,
          <a class="link" href="#requirements.gettable_socket_option" title="9.7.2.5.&#160;Gettable socket option requirements"><code class="computeroutput"><span class="identifier">GettableSocketOption</span></code></a>,
          and <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><p>
          Boolean socket option classes shall be defined as follows:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="comment">// constructors:</span>
  <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
  <span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">v</span><span class="special">);</span>

  <span class="comment">// members:</span>
  <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">bool</span> <span class="identifier">v</span><span class="special">);</span>

  <span class="keyword">bool</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

  <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">);</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
  <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
<span class="keyword">private</span><span class="special">:</span>
//int value_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
<span class="special">};</span>
</pre><p>
          The names and values used in the definition of the boolean socket option
          classes are described in the table below.
        </p><div class="table"><a name="classes.proposed_text.sockets.socket_base__bool_socket_options.t0"></a><p class="title"><b>Table&#160;26.&#160;Boolean socket options</b></p><div class="table-contents"><table class="table" summary="Boolean socket options"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th><th>
                  <p>
                    description
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">broadcast</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_BROADCAST</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether a socket permits sending of broadcast messages,
                    if supported by the protocol.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">debug</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_DEBUG</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether debugging information is recorded by the underlying
                    protocol.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">do_not_route</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_DONTROUTE</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether outgoing messages bypass standard routing
                    facilities.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">keep_alive</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_KEEPALIVE</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether a socket permits sending of keep_alive messages,
                    if supported by the protocol.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">out_of_band_inline</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_OOBINLINE</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether out-of-band data (also known as urgent data)
                    is received inline.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">reuse_address</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_REUSEADDR</span></code>
                  </p>
                </td><td>
                  <p>
                    Determines whether the validation of endpoints used for binding
                    a socket should allow the reuse of local endpoints, if supported
                    by the protocol.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>,
          <code class="computeroutput"><span class="identifier">SO_BROADCAST</span></code>, <code class="computeroutput"><span class="identifier">SO_DEBUG</span></code>, <code class="computeroutput"><span class="identifier">SO_DONTROUTE</span></code>,
          <code class="computeroutput"><span class="identifier">SO_KEEPALIVE</span></code>, <code class="computeroutput"><span class="identifier">SO_OOBINLINE</span></code> and <code class="computeroutput"><span class="identifier">SO_REUSEADDR</span></code>
          are defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.7.5.1.&#160;Boolean socket option constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.boolean_socket_option_constructors"></a>9.7.5.1.&#160;Boolean socket option constructors</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">value</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">v</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.5.2.&#160;Boolean socket option members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.boolean_socket_option_members"></a>9.7.5.2.&#160;Boolean socket option members</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">bool</span> <span class="identifier">v</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The stored socket option value. For extensible
              implementations, returns <code class="computeroutput"><span class="identifier">value_</span>
              <span class="special">!=</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">value</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.5.3.&#160;Boolean socket option members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.boolean_socket_option_members__extensible_implementations_"></a>9.7.5.3.&#160;Boolean socket option members (extensible implementations)</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">L</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">N</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">value_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if <code class="computeroutput"><span class="identifier">s</span></code> is not a valid
              data size for the protocol specified by <code class="computeroutput"><span class="identifier">p</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.7.6.&#160;Integral socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__int_socket_options"></a>9.7.6.&#160;Integral socket options</h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">receive_buffer_size</span></code>, <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">receive_low_watermark</span></code>,
          <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">send_buffer_size</span></code> and <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">send_low_watermark</span></code>
          classes are integral socket options.
        </p><p>
          Integral socket option classes satisfy the requirements for <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>, <code class="computeroutput"><span class="identifier">Assignable</span></code>,
          <a class="link" href="#requirements.gettable_socket_option" title="9.7.2.5.&#160;Gettable socket option requirements"><code class="computeroutput"><span class="identifier">GettableSocketOption</span></code></a>,
          and <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><p>
          Integral socket option classes shall be defined as follows:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="comment">// constructors:</span>
  <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
  <span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">v</span><span class="special">);</span>

  <span class="comment">// members:</span>
  <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">int</span> <span class="identifier">v</span><span class="special">);</span>

  <span class="keyword">int</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">);</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
  <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
<span class="keyword">private</span><span class="special">:</span>
//int value_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
<span class="special">};</span>
</pre><p>
          The names and values used in the definition of the integral socket option
          classes are described in the table below.
        </p><div class="table"><a name="classes.proposed_text.sockets.socket_base__int_socket_options.t0"></a><p class="title"><b>Table&#160;27.&#160;Integral socket options</b></p><div class="table-contents"><table class="table" summary="Integral socket options"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th><th>
                  <p>
                    description
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">receive_buffer_size</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_RCVBUF</span></code>
                  </p>
                </td><td>
                  <p>
                    Specifies the size of the receive buffer associated with a socket.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">receive_low_watermark</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_RCVLOWAT</span></code>
                  </p>
                </td><td>
                  <p>
                    Specifies the minimum number of bytes to process for socket input
                    operations.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">send_buffer_size</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_SNDBUF</span></code>
                  </p>
                </td><td>
                  <p>
                    Specifies the size of the send buffer associated with a socket.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">send_low_watermark</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SO_SNDLOWAT</span></code>
                  </p>
                </td><td>
                  <p>
                    Specifies the minimum number of bytes to process for socket output
                    operations.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>,
          <code class="computeroutput"><span class="identifier">SO_RCVBUF</span></code>, <code class="computeroutput"><span class="identifier">SO_RCVLOWAT</span></code>, <code class="computeroutput"><span class="identifier">SO_SNDBUF</span></code>
          and <code class="computeroutput"><span class="identifier">SO_SNDLOWAT</span></code> are defined
          in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.7.6.1.&#160;Integral socket option constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.integral_socket_option_constructors"></a>9.7.6.1.&#160;Integral socket option constructors</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">v</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.6.2.&#160;Integral socket option members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.integral_socket_option_members"></a>9.7.6.2.&#160;Integral socket option members</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">int</span> <span class="identifier">v</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">int</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The stored socket option value. For extensible
              implementations, returns <code class="computeroutput"><span class="identifier">value_</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.6.3.&#160;Integral socket option members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.integral_socket_option_members__extensible_implementations_"></a>9.7.6.3.&#160;Integral socket option members (extensible implementations)</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">L</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">N</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">value_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if <code class="computeroutput"><span class="identifier">s</span></code> is not a valid
              data size for the protocol specified by <code class="computeroutput"><span class="identifier">p</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.7.7.&#160;Class socket_base::linger"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__linger"></a>9.7.7.&#160;Class <code class="literal">socket_base::linger</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">linger</span></code> class represents
          a socket option for controlling the behavior when a socket is closed and
          unsent data is present.
        </p><p>
          <code class="computeroutput"><span class="identifier">linger</span></code> satisfies the requirements
          for <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>,
          <code class="computeroutput"><span class="identifier">Assignable</span></code>, <a class="link" href="#requirements.gettable_socket_option" title="9.7.2.5.&#160;Gettable socket option requirements"><code class="computeroutput"><span class="identifier">GettableSocketOption</span></code></a>, and <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">linger</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// constructors:</span>
        <span class="identifier">linger</span><span class="special">();</span>
        <span class="identifier">linger</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">e</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">t</span><span class="special">);</span>

        <span class="comment">// members:</span>
        <span class="keyword">bool</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">enabled</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">e</span><span class="special">);</span>

        <span class="keyword">int</span> <span class="identifier">timeout</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">timeout</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">t</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">class</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">linger</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
        <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
      <span class="keyword">private</span><span class="special">:</span>
//      ::linger value_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.7.7.1.&#160;socket_base::linger constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__socket_base__linger__constructors"></a>9.7.7.1.&#160;<code class="literal">socket_base::linger</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">linger</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">enabled</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">timeout</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">linger</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">e</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">e</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">timeout</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">t</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.7.2.&#160;socket_base::linger members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__socket_base__linger__members"></a>9.7.7.2.&#160;<code class="literal">socket_base::linger</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The stored socket option value for whether
              linger on close is enabled. For extensible implementations, returns
              <code class="computeroutput"><span class="identifier">value_</span><span class="special">.</span><span class="identifier">l_onoff</span> <span class="special">!=</span>
              <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">enabled</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">e</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">int</span> <span class="identifier">timeout</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The stored socket option value for the
              linger timeout, in seconds. For extensible implementations, returns
              <code class="computeroutput"><span class="identifier">value_</span><span class="special">.</span><span class="identifier">l_linger</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">timeout</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">timeout</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">t</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.7.3.&#160;socket_base::linger members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__socket_base__linger__members__extensible_implementations_"></a>9.7.7.3.&#160;<code class="literal">socket_base::linger</code> members (extensible implementations)</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The constant <code class="computeroutput"><span class="identifier">SOL_SOCKET</span></code>
              is defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">SO_LINGER</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The constant <code class="computeroutput"><span class="identifier">SO_LINGER</span></code>
              is defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">value_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if <code class="computeroutput"><span class="identifier">s</span> <span class="special">!=</span>
              <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">value_</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.7.8.&#160;Class template basic_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket"></a>9.7.8.&#160;Class template <code class="literal">basic_socket</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_socket</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">socket_base</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span> <span class="identifier">executor_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>implementation defined</em></span> <span class="identifier">native_handle_type</span><span class="special">;</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">typedef</span> <span class="identifier">Protocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

        <span class="comment">// basic_socket operations:</span>

        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>

        <span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span> <span class="special">=</span> <span class="identifier">protocol_type</span><span class="special">());</span>
        <span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">,</span>
                    <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>

        <span class="keyword">bool</span> <span class="identifier">is_open</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">close</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="identifier">non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="identifier">native_non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">bool</span> <span class="identifier">at_mark</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="identifier">at_mark</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="identifier">size_t</span> <span class="identifier">available</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="identifier">size_t</span> <span class="identifier">available</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">shutdown</span><span class="special">(</span><span class="identifier">shutdown_type</span> <span class="identifier">what</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">shutdown</span><span class="special">(</span><span class="identifier">shutdown_type</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="identifier">endpoint_type</span> <span class="identifier">remote_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="identifier">endpoint_type</span> <span class="identifier">remote_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

      <span class="keyword">protected</span><span class="special">:</span>
        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
        <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
        <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="identifier">basic_socket</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">basic_socket</span><span class="special">();</span>

        <span class="identifier">basic_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.7.8.1.&#160;basic_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__constructors"></a>9.7.8.1.&#160;<code class="literal">basic_socket</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              opening the socket as if by calling <code class="computeroutput"><span class="identifier">open</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              opening and binding the socket as if by calling:
</p><pre class="programlisting"><span class="identifier">open</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">());</span>
<span class="identifier">bind</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
             <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              assigning the existing native socket into the object as if by calling
              <code class="computeroutput"><span class="identifier">assign</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">,</span>
              <span class="identifier">native_socket</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> Whether this function satisfies the postcondition
              <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>
              is dependent on the implementation-defined semantics of the <code class="computeroutput"><span class="identifier">native_handle</span></code> type. &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_socket</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.8.2.&#160;basic_socket destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__destructor"></a>9.7.8.2.&#160;<code class="literal">basic_socket</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">basic_socket</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the socket, disables the linger socket option
              to prevent the destructor from blocking, and releases socket resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Otherwise, no effect. Handlers for cancelled operations shall be passed
              an error code <code class="computeroutput"><span class="identifier">ec</span></code> such
              that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div></div><div class="section" title="9.7.8.3.&#160;basic_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__assignment"></a>9.7.8.3.&#160;<code class="literal">basic_socket</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the socket, disables the linger socket option
              to prevent the assignment from blocking, and releases socket resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
              Handlers for cancelled operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span>
              <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>
              holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the socket, disables the linger socket option
              to prevent the assignment from blocking, and releases socket resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
              Handlers for cancelled operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span>
              <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>
              holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This assignment operator shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.8.4.&#160;basic_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__operations"></a>9.7.8.4.&#160;<code class="literal">basic_socket</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The associated executor.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The native representation of the socket
              implementation.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Establishes the postcondition, as if
              by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the native socket handle to the
              socket object.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> Whether this function satisfies the postcondition
              <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>
              is dependent on the implementation-defined semantics of the <code class="computeroutput"><span class="identifier">native_handle</span></code> type. &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            The main source of errors for <code class="computeroutput"><span class="identifier">assign</span></code>
            would be a call to register the socket with an OS-specific event demultiplexor,
            such as a <code class="computeroutput"><span class="identifier">kqueue</span></code>, an
            <code class="computeroutput"><span class="identifier">epoll</span></code> descriptor, a
            <code class="computeroutput"><span class="special">/</span><span class="identifier">dev</span><span class="special">/</span><span class="identifier">poll</span></code>
            device, or a <span class="emphasis"><em>Windows</em></span> I/O completion port. These
            errors may also be produced by <code class="computeroutput"><span class="identifier">open</span></code>,
            since that function would perform the same registration.
          </p></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_open</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="keyword">bool</span></code>
              indicating whether the socket was opened by a previous call to <code class="computeroutput"><span class="identifier">open</span></code> or <code class="computeroutput"><span class="identifier">assign</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">close</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the socket, and establishes the postcondition
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Otherwise, no effect. Handlers for cancelled asynchronous operations
              are passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the socket. Handlers for cancelled asynchronous
              operations are passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_not_supported</span></code>
              &#8212; Current conditions do not permit cancellation. The conditions under
              which cancellation of asynchronous operations is permitted are implementation-defined.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This flexibility is included to support implementations on <span class="emphasis"><em>Windows</em></span>
            versions prior to Vista, where the <code class="computeroutput"><span class="identifier">CancelIo</span></code>
            function will only cancel asynchronous operations started from the same
            thread. Vista provides <code class="computeroutput"><span class="identifier">CancelIoEx</span></code>
            which may be used to cancel all asynchronous operations associated with
            a socket.
          </p></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets an option on the socket, as if by
              <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Gets an option from the socket, as if
              by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Executes an I/O control command on the
              socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/ioctl.html" target="_top"><code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This proposal does not include any classes that satisfy <a class="link" href="#requirements.io_control_command" title="9.7.2.7.&#160;I/O control command requirements"><code class="computeroutput"><span class="identifier">IoControlCommand</span></code></a> requirements.
            However, implementation-specific extensions such as QoS may be implemented
            using <code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code>,
            and the <code class="computeroutput"><span class="identifier">io_control</span><span class="special">()</span></code>
            operation is included to allow these extensions to be supported.
          </p></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets the non-blocking mode of the socket.
              If <code class="computeroutput"><span class="identifier">mode</span></code> is true, subsequent
              synchronous operations may fail with error condition <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_would_block</span></code> if they are
              unable to perform the requested operation immediately. If <code class="computeroutput"><span class="identifier">mode</span></code> is false, subsequent synchronous
              operations shall block until complete.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The non-blocking mode has no effect on
              the behavior of asynchronous operations. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The non-blocking mode of the socket.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets the non-blocking mode of the underlying
              native socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/fcntl.html" target="_top"><code class="computeroutput"><span class="identifier">fcntl</span><span class="special">()</span></code></a>
              with command <code class="computeroutput"><span class="identifier">F_SETFL</span></code>
              to add or clear the file status flag <code class="computeroutput"><span class="identifier">O_NONBLOCK</span></code>.
              This mode shall have no effect on the behavior of the synchronous or
              asynchronous operations specified in this clause.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">invalid_argument</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">mode</span> <span class="special">==</span>
              <span class="keyword">false</span></code> and <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>. [<span class="emphasis"><em>Note:</em></span> As
              the combination does not make sense. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">native_non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The non-blocking mode of the underlying
              native socket.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> Implementations are permitted and encouraged
              to cache the native non-blocking mode that was applied through a prior
              call to <code class="computeroutput"><span class="identifier">native_non_blocking</span></code>.
              Implementations may return an incorrect value if a program sets the
              non-blocking mode directly on the socket, by calling an operating system-specific
              function on the result of <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">at_mark</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="identifier">at_mark</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Determines if the socket is at the out-of-band
              data mark, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sockatmark.html" target="_top"><code class="computeroutput"><span class="identifier">sockatmark</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="keyword">bool</span></code>
              indicating whether the socket is at the out-of-band data mark.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">available</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">size_t</span> <span class="identifier">available</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An indication of the number of bytes
              that may be read without blocking, or 0 if an error occurs.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Binds the socket to the specified local
              endpoint, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/bind.html" target="_top"><code class="computeroutput"><span class="identifier">bind</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">shutdown</span><span class="special">(</span><span class="identifier">shutdown_type</span> <span class="identifier">what</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">shutdown</span><span class="special">(</span><span class="identifier">shutdown_type</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Shuts down all or part of a full-duplex
              connection for the socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/shutdown.html" target="_top"><code class="computeroutput"><span class="identifier">shutdown</span><span class="special">()</span></code></a>.
              If <code class="computeroutput"><span class="identifier">what</span></code> is <code class="computeroutput"><span class="identifier">shutdown_receive</span></code>, uses <span class="emphasis"><em>POSIX</em></span>
              <code class="computeroutput"><span class="identifier">SHUT_RD</span></code>. If <code class="computeroutput"><span class="identifier">what</span></code> is <code class="computeroutput"><span class="identifier">shutdown_send</span></code>,
              uses <span class="emphasis"><em>POSIX</em></span> <code class="computeroutput"><span class="identifier">SHUT_WR</span></code>.
              If <code class="computeroutput"><span class="identifier">what</span></code> is <code class="computeroutput"><span class="identifier">shutdown_both</span></code>, uses <span class="emphasis"><em>POSIX</em></span>
              <code class="computeroutput"><span class="identifier">SHUT_RDWR</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Determines the locally-bound endpoint
              associated with the socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the locally-bound endpoint.
              Otherwise <code class="computeroutput"><span class="identifier">endpoint_type</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">remote_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">endpoint_type</span> <span class="identifier">remote_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Determines the remote endpoint associated
              with the socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the remote endpoint. Otherwise
              <code class="computeroutput"><span class="identifier">endpoint_type</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is false, opens the socket by performing
              <code class="computeroutput"><span class="identifier">open</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">(),</span>
              <span class="identifier">ec</span><span class="special">)</span></code>;
              then, if no error has occurred, connects the socket to the specified
              remote endpoint, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is false, opens the socket by performing
              <code class="computeroutput"><span class="identifier">open</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">(),</span>
              <span class="identifier">ec</span><span class="special">)</span></code>;
              then, if no error has occurred, initiates an asynchronous operation
              to connect the socket to the specified remote endpoint, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous connect operations are initiated such that
              the operations may logically be performed in parallel, the behavior
              is unspecified. When an asynchronous connect operation and an asynchronous
              read or write operation are initiated such that they may logically
              be performed in parallel, the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code> or <code class="computeroutput"><span class="identifier">cancel</span></code>, while there is an incomplete
              asynchronous connect operation, the behavior is unspecified.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Waits for the socket to be ready to read,
              ready to write, or to have error conditions pending, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/select.html" target="_top"><code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              wait for the socket to be ready to read, ready to write, or to have
              error conditions pending, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/select.html" target="_top"><code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous wait operations are initiated with the same
              <code class="computeroutput"><span class="identifier">wait_type</span></code> value, all
              operations shall complete when the socket enters the corresponding
              ready state. The order of invocation of the handlers for these operations
              is unspecified.
            </p></blockquote></div></div></div><div class="section" title="9.7.9.&#160;Class template basic_datagram_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_datagram_socket"></a>9.7.9.&#160;Class template <code class="literal">basic_datagram_socket</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_datagram_socket</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="emphasis"><em>implementation defined</em></span> <span class="identifier">native_handle_type</span><span class="special">;</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">typedef</span> <span class="identifier">Protocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                              <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_datagram_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">basic_datagram_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">basic_datagram_socket</span><span class="special">();</span>

        <span class="identifier">basic_datagram_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_datagram_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_datagram_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_datagram_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_datagram_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="comment">// basic_datagram_socket operations::</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                              <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                                  <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                                  <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                                  <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                                  <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                                  <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                             <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.7.9.1.&#160;basic_datagram_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__constructors"></a>9.7.9.1.&#160;<code class="literal">basic_datagram_socket</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">protocol</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">endpoint</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">native_socket</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">basic_datagram_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_datagram_socket</span><span class="special">(</span><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.9.2.&#160;basic_datagram_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__assignment"></a>9.7.9.2.&#160;<code class="literal">basic_datagram_socket</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_datagram_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_datagram_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_datagram_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This assignment operator shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.9.3.&#160;basic_datagram_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__operations"></a>9.7.9.3.&#160;<code class="literal">basic_datagram_socket</code> operations</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_read_operations" title="9.6.2.6.&#160;Requirements on synchronous read operations">synchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Reads data from a connection-mode or
              connectionless-mode socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message reception. [<span class="emphasis"><em>Note:</em></span> It is normally
              used with connection-mode sockets because it does not permit the application
              to retrieve the source endpoint of received data. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes received.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_read_operations" title="9.6.2.7.&#160;Requirements on asynchronous read operations">asynchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span> <span class="special">&amp;</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span>
              <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              read data from a connection-mode or connectionless-mode socket, as
              if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message reception. [<span class="emphasis"><em>Note:</em></span> It is normally
              used with connection-mode sockets because it does not permit the application
              to retrieve the source endpoint of received data. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous receive operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall fill the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous receive operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, <code class="computeroutput"><span class="identifier">send</span></code>
              or <code class="computeroutput"><span class="identifier">send_to</span></code>, while there
              is a pending asynchronous receive operation, the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes received. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">invalid_argument</span></code>
              &#8212; if <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span>
              <span class="special">&amp;</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span> <span class="special">!=</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">receive_from</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                      <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_read_operations" title="9.6.2.6.&#160;Requirements on synchronous read operations">synchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Reads data from a connection-mode or
              connectionless-mode socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">sender</span></code> is updated
              to reflect the origin of the data, and <code class="computeroutput"><span class="identifier">flags</span></code>
              specifies the type of message reception. [<span class="emphasis"><em>Note:</em></span>
              It is normally used with connectionless-mode sockets because it permits
              the application to retrieve the source endpoint of received data. &#8212;
              <span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes received.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Returns <code class="computeroutput"><span class="identifier">async_receive_from</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">sender</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive_from</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">sender</span><span class="special">,</span>
                          <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_read_operations" title="9.6.2.7.&#160;Requirements on asynchronous read operations">asynchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span> <span class="special">&amp;</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span>
              <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              read data from a connection-mode or connectionless-mode socket, as
              if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">sender</span></code> is updated
              to reflect the source of the data, and <code class="computeroutput"><span class="identifier">flags</span></code>
              specifies the type of message reception. [<span class="emphasis"><em>Note:</em></span>
              It is normally used with connectionless-mode sockets because it permits
              the application to retrieve the source endpoint of received data. &#8212;
              <span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous receive operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall fill the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous receive operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, <code class="computeroutput"><span class="identifier">send</span></code>
              or <code class="computeroutput"><span class="identifier">send_to</span></code>, while there
              is a pending asynchronous receive operation, the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes received. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">invalid_argument</span></code>
              &#8212; if <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span>
              <span class="special">&amp;</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span> <span class="special">!=</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_write_operations" title="9.6.2.8.&#160;Requirements on synchronous write operations">synchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Writes data to a connected socket, as
              if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message transmission.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes sent.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                  <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                  <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_write_operations" title="9.6.2.9.&#160;Requirements on asynchronous write operations">asynchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              write data to a connected socket, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message transmission.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous send operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall transmit the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous send operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, <code class="computeroutput"><span class="identifier">receive</span></code>
              or <code class="computeroutput"><span class="identifier">receive_from</span></code>, while
              there is a pending asynchronous send operation, the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes sent. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">send_to</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">destination</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_write_operations" title="9.6.2.8.&#160;Requirements on synchronous write operations">synchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Writes data to a connection-mode or connectionless-mode
              socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">destination</span></code> is
              the destination endpoint of the data, and <code class="computeroutput"><span class="identifier">flags</span></code>
              specifies the type of message transmission.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes sent.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_send_to</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">destination</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send_to</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
                     <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_write_operations" title="9.6.2.9.&#160;Requirements on asynchronous write operations">asynchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              write data to a connection-mode or connectionless-mode socket, as if
              by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">destination</span></code> is
              the destination endpoint of the data, and <code class="computeroutput"><span class="identifier">flags</span></code>
              specifies the type of message reception.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous send operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall transmit the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous send operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, <code class="computeroutput"><span class="identifier">receive</span></code>
              or <code class="computeroutput"><span class="identifier">receive_from</span></code>, while
              there is a pending asynchronous send operation, the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes sent. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.7.10.&#160;Class template basic_stream_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_stream_socket"></a>9.7.10.&#160;Class template <code class="literal">basic_stream_socket</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_stream_socket</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="emphasis"><em>implementation defined</em></span> <span class="identifier">native_handle_type</span><span class="special">;</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">typedef</span> <span class="identifier">Protocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
        <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
        <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                            <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
        <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_stream_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">basic_stream_socket</span><span class="special">();</span>

        <span class="identifier">basic_stream_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_stream_socket</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_stream_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_stream_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_stream_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="comment">// basic_stream_socket operations:</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                         <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                             <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                             <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                      <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                          <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                          <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                           <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                               <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
          <span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                            <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                                <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Instances of the <code class="computeroutput"><span class="identifier">basic_stream_socket</span></code>
          class template meet the requirements for <a class="link" href="#requirements.sync_read_stream" title="9.6.2.10.&#160;Buffer-oriented synchronous read stream requirements">synchronous
          read streams</a>, <a class="link" href="#requirements.sync_write_stream" title="9.6.2.12.&#160;Buffer-oriented synchronous write stream requirements">synchronous
          write streams</a>, <a class="link" href="#requirements.async_read_stream" title="9.6.2.11.&#160;Buffer-oriented asynchronous read stream requirements">asynchronous
          read streams</a>, and <a class="link" href="#requirements.async_write_stream" title="9.6.2.13.&#160;Buffer-oriented asynchronous write stream requirements">asynchronous
          write streams</a>.
        </p><div class="section" title="9.7.10.1.&#160;basic_stream_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__constructors"></a>9.7.10.1.&#160;<code class="literal">basic_stream_socket</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">protocol</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">endpoint</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_socket</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">native_socket</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_stream_socket</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.10.2.&#160;basic_stream_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__assignment"></a>9.7.10.2.&#160;<code class="literal">basic_stream_socket</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_stream_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_stream_socket</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_stream_socket</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;&gt;(</span><span class="identifier">rhs</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This assignment operator shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.10.3.&#160;basic_stream_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__operations"></a>9.7.10.3.&#160;<code class="literal">basic_stream_socket</code> operations</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                 <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_read_operations" title="9.6.2.6.&#160;Requirements on synchronous read operations">synchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Reads data from the socket, as if by
              <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message reception. The operation shall not block if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span>
              <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes received.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">eof</span></code>
              &#8212; if there is no data to be received and the peer performed an orderly
              shutdown.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_receive</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                     <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_read_operations" title="9.6.2.7.&#160;Requirements on asynchronous read operations">asynchronous
              read operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span> <span class="special">&amp;</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span>
              <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              read data from the socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message reception. The operation shall complete immediately
              if <code class="computeroutput"><span class="identifier">buffer_size</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">)</span>
              <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous receive operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall fill the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous receive operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, or <code class="computeroutput"><span class="identifier">send</span></code>,
              while there is a pending asynchronous receive operation, the behavior
              is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes received. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">invalid_argument</span></code>
              &#8212; if <code class="computeroutput"><span class="special">(</span><span class="identifier">flags</span>
              <span class="special">&amp;</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span><span class="special">)</span> <span class="special">!=</span> <span class="number">0</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">stream_errc</span><span class="special">::</span><span class="identifier">eof</span></code>
              &#8212; if there is no data to be received and the peer performed an orderly
              shutdown.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              A <a class="link" href="#requirements.synchronous_write_operations" title="9.6.2.8.&#160;Requirements on synchronous write operations">synchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Writes data to the socket, as if by
              <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message transmission.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the number of bytes sent.
              Otherwise <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_send</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                  <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</span> <span class="identifier">flags</span><span class="special">,</span>
                  <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_write_operations" title="9.6.2.9.&#160;Requirements on asynchronous write operations">asynchronous
              write operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              write data to the socket, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              where <code class="computeroutput"><span class="identifier">flags</span></code> specifies
              the type of message transmission.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous send operations with zero <code class="computeroutput"><span class="identifier">flags</span></code> are initiated such that the
              operations may logically be performed in parallel, the implementation
              shall transmit the <code class="computeroutput"><span class="identifier">buffers</span></code>
              in the order in which the operations were issued. The order of invocation
              of the handlers for these operations is unspecified. When multiple
              asynchronous send operations with non-zero <code class="computeroutput"><span class="identifier">flags</span></code>
              are initiated such that operations may logically be performed in parallel,
              the behavior is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on the socket, other
              than <code class="computeroutput"><span class="identifier">close</span></code>, <code class="computeroutput"><span class="identifier">cancel</span></code>, or <code class="computeroutput"><span class="identifier">receive</span></code>,
              while there is a pending asynchronous send operation, the behavior
              is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If the operation completes successfully, <code class="computeroutput"><span class="identifier">n</span></code>
              is the number of bytes sent. Otherwise <code class="computeroutput"><span class="identifier">n</span></code>
              is <code class="computeroutput"><span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                   <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_read_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">MutableBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                       <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_receive</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">&gt;</span>
  <span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                    <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_write_some</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ConstBufferSequence</span><span class="special">&amp;</span> <span class="identifier">buffers</span><span class="special">,</span>
                        <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_send</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
              <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.7.11.&#160;Class template basic_socket_acceptor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_acceptor"></a>9.7.11.&#160;Class template <code class="literal">basic_socket_acceptor</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_socket_acceptor</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">socket_base</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span> <span class="identifier">executor_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="emphasis"><em>implementation defined</em></span> <span class="identifier">native_handle_type</span><span class="special">;</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">typedef</span> <span class="identifier">Protocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

        <span class="comment">// construct / copy / destroy:</span>

        <span class="keyword">explicit</span> <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span>
                              <span class="keyword">bool</span> <span class="identifier">reuse_addr</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">);</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                              <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">);</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="special">~</span><span class="identifier">basic_socket_acceptor</span><span class="special">();</span>

        <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

        <span class="comment">// basic_socket_acceptor operations:</span>

        <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>

        <span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span> <span class="special">=</span> <span class="identifier">protocol_type</span><span class="special">());</span>
        <span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">);</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">,</span>
                    <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span> <span class="comment">// See <a class="link" href="#requirements.native_handles" title="9.7.2.1.&#160;Native handles">native handles</a></span>

        <span class="keyword">bool</span> <span class="identifier">is_open</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">close</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="identifier">non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="identifier">native_non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">listen</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">backlog</span> <span class="special">=</span> <span class="identifier">max_connections</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">listen</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">backlog</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">void</span> <span class="identifier">enable_connection_aborted</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                            <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
          <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                      <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                            <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span>
                            <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.7.11.1.&#160;basic_socket_acceptor constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__constructors"></a>9.7.11.1.&#160;<code class="literal">basic_socket_acceptor</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              opening the acceptor as if by calling <code class="computeroutput"><span class="identifier">open</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span>
                      <span class="keyword">bool</span> <span class="identifier">reuse_addr</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              opening and binding the acceptor as if by calling:
</p><pre class="programlisting"><span class="identifier">open</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">());</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">reuse_addr</span><span class="special">)</span>
  <span class="identifier">set_option</span><span class="special">(</span><span class="identifier">reuse_address</span><span class="special">(</span><span class="keyword">true</span><span class="special">));</span>
<span class="identifier">bind</span><span class="special">(</span><span class="identifier">endpoint</span><span class="special">);</span>
<span class="identifier">listen</span><span class="special">();</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            [<a class="link" href="#ref-UNPV1">UNPV1</a>] recommends setting <code class="computeroutput"><span class="identifier">SO_REUSEADDR</span></code> by default in all TCP
            servers, although there are some security implications in doing so.
          </p></div><pre class="programlisting"><span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                      <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              assigning the existing native acceptor into the object as if by calling
              <code class="computeroutput"><span class="identifier">assign</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">,</span>
              <span class="identifier">native_acceptor</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> Whether this function satisfies the postcondition
              <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>
              is dependent on the implementation-defined semantics of the <code class="computeroutput"><span class="identifier">native_handle</span></code> type. &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code> returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code>
              prior to the constructor invocation.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_socket_acceptor</span><span class="special">(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the constructor invocation.<br>
              &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code> returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code>
              prior to the constructor invocation.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.11.2.&#160;basic_socket_acceptor destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__destructor"></a>9.7.11.2.&#160;<code class="literal">basic_socket_acceptor</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">basic_socket_acceptor</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the acceptor, and releases acceptor resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Otherwise, no effect. Handlers for cancelled operations shall be passed
              an error code <code class="computeroutput"><span class="identifier">ec</span></code> such
              that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div></div><div class="section" title="9.7.11.3.&#160;basic_socket_acceptor assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__assignment"></a>9.7.11.3.&#160;<code class="literal">basic_socket_acceptor</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_socket_acceptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the acceptor, and releases acceptor resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
              Handlers for cancelled operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span>
              <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>
              holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_socket_acceptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the acceptor, and releases acceptor resources
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
              Handlers for cancelled operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code> such that <code class="computeroutput"><span class="identifier">ec</span>
              <span class="special">==</span> <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>
              holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code>
              returns the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">enable_connection_aborted</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This assignment operator shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>
              is implicitly convertible to <code class="computeroutput"><span class="identifier">Protocol</span></code>.
            </p></blockquote></div></div><div class="section" title="9.7.11.4.&#160;basic_socket_acceptor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__operations"></a>9.7.11.4.&#160;<code class="literal">basic_socket_acceptor</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The associated executor.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The native representation of the acceptor
              implementation.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">open</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Establishes the postcondition, as if
              by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">&amp;</span> <span class="identifier">native_acceptor</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the native acceptor handle to
              the acceptor object.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> Whether this function satisfies the postcondition
              <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>
              is dependent on the implementation-defined semantics of the <code class="computeroutput"><span class="identifier">native_handle</span></code> type. &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            The main source of errors for <code class="computeroutput"><span class="identifier">assign</span></code>
            would be a call to register the acceptor with an OS-specific event demultiplexor,
            such as a <code class="computeroutput"><span class="identifier">kqueue</span></code>, an
            <code class="computeroutput"><span class="identifier">epoll</span></code> descriptor, a
            <code class="computeroutput"><span class="special">/</span><span class="identifier">dev</span><span class="special">/</span><span class="identifier">poll</span></code>
            device, or a <span class="emphasis"><em>Windows</em></span> I/O completion port. These
            errors may also be produced by <code class="computeroutput"><span class="identifier">open</span></code>,
            since that function would perform the same registration.
          </p></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_open</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A <code class="computeroutput"><span class="keyword">bool</span></code>
              indicating whether the acceptor was opened by a previous call to <code class="computeroutput"><span class="identifier">open</span></code> or <code class="computeroutput"><span class="identifier">assign</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">close</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the acceptor, and establishes the postcondition
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/close.html" target="_top"><code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code></a>.
              Otherwise, no effect. Handlers for cancelled asynchronous operations
              are passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code> is true, cancels any asynchronous
              operations associated with the acceptor. Handlers for cancelled asynchronous
              operations are passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_not_supported</span></code>
              &#8212; Current conditions do not permit cancellation. The conditions under
              which cancellation of asynchronous operations is permitted are implementation-defined.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This flexibility is included to support implementations on <span class="emphasis"><em>Windows</em></span>
            versions prior to Vista, where the <code class="computeroutput"><span class="identifier">CancelIo</span></code>
            function will only cancel asynchronous operations started from the same
            thread. Vista provides <code class="computeroutput"><span class="identifier">CancelIoEx</span></code>
            which may be used to cancel all asynchronous operations associated with
            an acceptor.
          </p></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">set_option</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">SettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets an option on the acceptor, as if
              by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GettableSocketOption</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">get_option</span><span class="special">(</span><span class="identifier">GettableSocketOption</span><span class="special">&amp;</span> <span class="identifier">option</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Gets an option from the acceptor, as
              if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">IoControlCommand</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">io_control</span><span class="special">(</span><span class="identifier">IoControlCommand</span><span class="special">&amp;</span> <span class="identifier">command</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Executes an I/O control command on the
              acceptor, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/ioctl.html" target="_top"><code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This proposal does not include any classes that satisfy <a class="link" href="#requirements.io_control_command" title="9.7.2.7.&#160;I/O control command requirements"><code class="computeroutput"><span class="identifier">IoControlCommand</span></code></a> requirements.
            However, implementation-specific extensions such as QoS may be implemented
            using <code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code>,
            and the <code class="computeroutput"><span class="identifier">io_control</span><span class="special">()</span></code>
            operation is included to allow these extensions to be supported.
          </p></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets the non-blocking mode of the acceptor.
              If <code class="computeroutput"><span class="identifier">mode</span></code> is true, subsequent
              synchronous operations may fail with error condition <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_would_block</span></code> if they are
              unable to perform the requested operation immediately. If <code class="computeroutput"><span class="identifier">mode</span></code> is false, subsequent synchronous
              operations shall block until complete.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The non-blocking mode has no effect on
              the behavior of asynchronous operations. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The non-blocking mode of the acceptor.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">native_non_blocking</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets the non-blocking mode of the underlying
              native acceptor, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/fcntl.html" target="_top"><code class="computeroutput"><span class="identifier">fcntl</span><span class="special">()</span></code></a>
              with command <code class="computeroutput"><span class="identifier">F_SETFL</span></code>
              to add or clear the file status flag <code class="computeroutput"><span class="identifier">O_NONBLOCK</span></code>.
              This mode shall have no effect on the behavior of the synchronous or
              asynchronous operations specified in this clause.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">invalid_argument</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">mode</span> <span class="special">==</span>
              <span class="keyword">false</span></code> and <code class="computeroutput"><span class="identifier">non_blocking</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>. [<span class="emphasis"><em>Note:</em></span> As
              the combination does not make sense. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">native_non_blocking</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The non-blocking mode of the underlying
              native acceptor.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> Implementations are permitted and encouraged
              to cache the native non-blocking mode that was applied through a prior
              call to <code class="computeroutput"><span class="identifier">native_non_blocking</span></code>.
              Implementations may return an incorrect value if a program sets the
              non-blocking mode directly on the acceptor, by calling an operating
              system-specific function on the result of <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">bind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Binds the acceptor to the specified local
              endpoint, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/bind.html" target="_top"><code class="computeroutput"><span class="identifier">bind</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">listen</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">backlog</span> <span class="special">=</span> <span class="identifier">max_connections</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">listen</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">backlog</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Marks the acceptor as ready to accept
              connections, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/listen.html" target="_top"><code class="computeroutput"><span class="identifier">listen</span><span class="special">()</span></code></a>.
              If <code class="computeroutput"><span class="identifier">backlog</span> <span class="special">==</span>
              <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">max_connections</span></code>, the implementation
              shall set the acceptor's listen queue to the maximum allowable length.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">endpoint_type</span> <span class="identifier">local_endpoint</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Determines the locally-bound endpoint
              associated with the acceptor, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, the locally-bound endpoint.
              Otherwise <code class="computeroutput"><span class="identifier">endpoint_type</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">enable_connection_aborted</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">mode</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">mode</span></code>
              is true, subsequent synchronous or asynchronous accept operations are
              permitted to fail with error condition <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">connection_aborted</span></code>.
              If <code class="computeroutput"><span class="identifier">mode</span></code> is false, subsequent
              accept operations shall not fail with <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">connection_aborted</span></code>.
              [<span class="emphasis"><em>Note:</em></span> If <code class="computeroutput"><span class="identifier">mode</span></code>
              is false, the implementation will restart the call to <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>
              if it fails with <code class="computeroutput"><span class="identifier">ECONNABORTED</span></code>.
              &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            The <code class="computeroutput"><span class="identifier">ECONNABORTED</span></code> error
            is suppressed by default since it is a transient error, is rarely useful,
            and handling it correctly adds complexity to even very simple servers.
            However, one potential use is in the detection of denial-of-service attacks,
            and for this reason we include the ability to re-enable the error.
          </p></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">enable_connection_aborted</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> Whether accept operations are permitted
              to fail with <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">connection_aborted</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">Protocol</span></code> and <code class="computeroutput"><span class="identifier">OtherProtocol</span></code> are the same type,
              or <code class="computeroutput"><span class="identifier">Protocol</span></code> is convertible
              to <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Associates <code class="computeroutput"><span class="identifier">socket</span></code>
              with the first connection successfully extracted from the queue of
              pending connections of the acceptor, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                    <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">Protocol</span></code> and <code class="computeroutput"><span class="identifier">OtherProtocol</span></code> are the same type,
              or <code class="computeroutput"><span class="identifier">Protocol</span></code> is convertible
              to <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              associate <code class="computeroutput"><span class="identifier">socket</span></code> with
              the first connection successfully extracted from the queue of pending
              connections of the acceptor, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous accept operations are initiated such that
              the operations may logically be performed in parallel, the behavior
              is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
              <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">Protocol</span></code> and <code class="computeroutput"><span class="identifier">OtherProtocol</span></code> are the same type,
              or <code class="computeroutput"><span class="identifier">Protocol</span></code> is convertible
              to <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Associates <code class="computeroutput"><span class="identifier">socket</span></code>
              with the first connection successfully extracted from the queue of
              pending connections of the acceptor, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>.
              On success, sets <code class="computeroutput"><span class="identifier">endpoint</span></code>
              to the remote endpoint of the accepted connection.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_accept</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">OtherProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</span><span class="special">,</span>
                    <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <br> &#8212; <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">Protocol</span></code> and <code class="computeroutput"><span class="identifier">OtherProtocol</span></code> are the same type,
              or <code class="computeroutput"><span class="identifier">Protocol</span></code> is convertible
              to <code class="computeroutput"><span class="identifier">OtherProtocol</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              associate <code class="computeroutput"><span class="identifier">socket</span></code> with
              the first connection successfully extracted from the queue of pending
              connections of the acceptor, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>.
              On success, sets <code class="computeroutput"><span class="identifier">endpoint</span></code>
              to the remote endpoint of the accepted connection.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous accept operations are initiated such that
              the operations may logically be performed in parallel, the behavior
              is unspecified.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">already_open</span></code>
              &#8212; if the requirement <code class="computeroutput"><span class="special">!</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is unmet.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Waits for the acceptor to be ready to
              read, ready to write, or to have error conditions pending, as if by
              <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/select.html" target="_top"><code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code></a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">wait_type</span> <span class="identifier">w</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              wait for the acceptor to be ready to read, ready to write, or to have
              error conditions pending, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/select.html" target="_top"><code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When multiple asynchronous wait operations are initiated with the same
              <code class="computeroutput"><span class="identifier">wait_type</span></code> value, all
              operations shall complete when the acceptor enters the corresponding
              ready state. The order of invocation of the handlers for these operations
              is unspecified.
            </p></blockquote></div></div></div></div><div class="section" title="9.8.&#160;Socket streams"><div class="titlepage"><div><div><h3 class="title"><a name="network.socket_streams"></a>9.8.&#160;Socket streams</h3></div></div></div><div class="section" title="9.8.1.&#160;Class template basic_socket_streambuf"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_streambuf"></a>9.8.1.&#160;Class template <code class="literal">basic_socket_streambuf</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_socket_streambuf</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">basic_streambuf</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span>
        <span class="keyword">public</span> <span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">time_point</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">duration</span><span class="special">;</span>

        <span class="comment">// construct / destroy:</span>

        <span class="identifier">basic_socket_streambuf</span><span class="special">();</span>
        <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">basic_socket_streambuf</span><span class="special">();</span>

        <span class="comment">// members:</span>

        <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
          <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="special">);</span>

        <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">close</span><span class="special">();</span>

        <span class="identifier">error_code</span> <span class="identifier">puberror</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>

      <span class="keyword">protected</span><span class="special">:</span>
        <span class="comment">// overridden virtual functions:</span>
        <span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">underflow</span><span class="special">();</span>
        <span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">pbackfail</span><span class="special">(</span><span class="identifier">int_type</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">());</span>
        <span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">overflow</span><span class="special">(</span><span class="identifier">int_type</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">());</span>
        <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">sync</span><span class="special">();</span>
        <span class="keyword">virtual</span> <span class="identifier">streambuf</span><span class="special">*</span> <span class="identifier">setbuf</span><span class="special">(</span><span class="identifier">char_type</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">);</span>
        <span class="keyword">virtual</span> <span class="identifier">error_code</span> <span class="identifier">error</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">error_code</span> <span class="identifier">ec_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">time_point</span> <span class="identifier">expiry_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code> associates both the input sequence
          and the output sequence with a socket. The input and output sequences are
          independent and do not support seeking. Multibyte/wide character conversion
          is not supported.
        </p><div class="section" title="9.8.1.1.&#160;basic_socket_streambuf constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_streambuf__constructors"></a>9.8.1.1.&#160;<code class="literal">basic_socket_streambuf</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>,
              initializing the base classes with <code class="computeroutput"><span class="identifier">basic_streambuf</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;()</span></code> and <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;(</span><span class="identifier">ios</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">ios</span></code>
              is an unspecified object of class <code class="computeroutput"><span class="identifier">io_service</span></code>
              that has a longer lifetime than the <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code> base.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">basic_socket_streambuf</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys an object of class <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code>.
              If a put area exists, calls <code class="computeroutput"><span class="identifier">overflow</span><span class="special">(</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code> to flush characters. [<span class="emphasis"><em>Note:</em></span>
              The socket is closed by the <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;</span></code> destructor. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div></div><div class="section" title="9.8.1.2.&#160;basic_socket_streambuf members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_streambuf__members"></a>9.8.1.2.&#160;<code class="literal">basic_socket_streambuf</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">connect</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Resets the <code class="computeroutput"><span class="identifier">streambuf</span></code>
              get and put areas, closes the socket as if by calling <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec_</span><span class="special">)</span></code>,
              then establishes a connection as if by performing:
</p><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">e</span><span class="special">,</span> <span class="emphasis"><em>unspecified</em></span><span class="special">);</span>
</pre><p>
              <code class="computeroutput"><span class="identifier">ec_</span></code> is set to reflect
              the error code produced by the operation. If the operation does not
              complete before the absolute timeout specified by <code class="computeroutput"><span class="identifier">expiry_</span></code>,
              the socket is closed and <code class="computeroutput"><span class="identifier">ec_</span></code>
              is set to <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> if <code class="computeroutput"><span class="special">!</span><span class="identifier">ec_</span></code>, <code class="computeroutput"><span class="keyword">this</span></code>;
              otherwise, a null pointer.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
  <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> The <code class="computeroutput"><span class="identifier">Protocol</span></code>
              type must meet the requirements for an <a class="link" href="#requirements.internet_protocol" title="9.11.2.1.&#160;Internet protocol requirements">internet
              protocol</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Resets the <code class="computeroutput"><span class="identifier">streambuf</span></code>
              get and put areas. Constructs an object <code class="computeroutput"><span class="identifier">q</span></code>
              of type <code class="computeroutput"><span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">resolver</span><span class="special">::</span><span class="identifier">query</span></code> by initializing the object
              with <code class="computeroutput"><span class="identifier">q</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)</span>...<span class="special">)</span></code>, then establishes a connection as
              if by performing:
</p><pre class="programlisting"><span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">resolver</span> <span class="identifier">resolver</span><span class="special">(</span><span class="identifier">ios</span><span class="special">);</span>
<span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">resolver</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">resolver</span><span class="special">.</span><span class="identifier">resolve</span><span class="special">(</span><span class="identifier">q</span><span class="special">,</span> <span class="identifier">ec_</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">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">async_connect</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="emphasis"><em>unspecified</em></span><span class="special">);</span>
</pre><p>
              where <code class="computeroutput"><span class="identifier">ios</span></code> is an unspecified
              object of class <code class="computeroutput"><span class="identifier">io_service</span></code>.
              <code class="computeroutput"><span class="identifier">ec_</span></code> is set to reflect
              the error code produced by the asynchronous operation. If the operation
              does not complete before the absolute timeout specified by <code class="computeroutput"><span class="identifier">expiry_</span></code>, the socket is closed and
              <code class="computeroutput"><span class="identifier">ec_</span></code> is set to <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> if <code class="computeroutput"><span class="special">!</span><span class="identifier">ec_</span></code>, <code class="computeroutput"><span class="keyword">this</span></code>;
              otherwise, a null pointer.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;*</span> <span class="identifier">close</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If a put area exists, calls <code class="computeroutput"><span class="identifier">overflow</span><span class="special">(</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code>
              to flush characters. Calls:
</p><pre class="programlisting"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;::</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec_</span><span class="special">);</span>
</pre><p>
              then resets the get and put areas. If the call to <code class="computeroutput"><span class="identifier">overflow</span></code>
              fails, or if <code class="computeroutput"><span class="special">!</span><span class="identifier">ec_</span></code>,
              then <code class="computeroutput"><span class="identifier">close</span></code> fails.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">this</span></code>
              on success, a null pointer otherwise.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">puberror</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">error</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">expiry_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">expiry_</span>
              <span class="special">==</span> <span class="identifier">t</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.8.1.3.&#160;basic_socket_streambuf overridden virtual functions"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_streambuf__overridden_virtual_functions"></a>9.8.1.3.&#160;<code class="literal">basic_socket_streambuf</code> overridden virtual functions</h5></div></div></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">underflow</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Behaves according to the description
              of <code class="computeroutput"><span class="identifier">basic_streambuf</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">underflow</span><span class="special">()</span></code>, with the specialization that a sequence
              of characters is read from the input sequence as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/recvmsg.html" target="_top"><code class="computeroutput"><span class="identifier">recvmsg</span><span class="special">()</span></code></a>,
              and <code class="computeroutput"><span class="identifier">ec_</span></code> is set to reflect
              the error code produced by the operation. If the operation does not
              complete before the absolute timeout specified by <code class="computeroutput"><span class="identifier">expiry_</span></code>,
              the socket is closed and <code class="computeroutput"><span class="identifier">ec_</span></code>
              is set to <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Returns <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">()</span></code> to indicate failure. Otherwise returns
              <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">to_int_type</span><span class="special">(*</span><span class="identifier">gptr</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">pbackfail</span><span class="special">(</span><span class="identifier">int_type</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">());</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Puts back the character designated by
              <code class="computeroutput"><span class="identifier">c</span></code> to the input sequence,
              if possible, in one of three ways:<br> <br> &#8212; If <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eq_int_type</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
              and if the function makes a putback position available, and if <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eq</span><span class="special">(</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">to_char_type</span><span class="special">(</span><span class="identifier">c</span><span class="special">),</span><span class="identifier">gptr</span><span class="special">()[-</span><span class="number">1</span><span class="special">])</span></code> returns
              <code class="computeroutput"><span class="keyword">true</span></code>, decrements the next
              pointer for the input sequence, <code class="computeroutput"><span class="identifier">gptr</span><span class="special">()</span></code>.<br> Returns: <code class="computeroutput"><span class="identifier">c</span></code>.<br>
              <br> &#8212; If <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eq_int_type</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
              and if the function makes a putback position available, and if the
              function is permitted to assign to the putback position, decrements
              the next pointer for the input sequence, and stores <code class="computeroutput"><span class="identifier">c</span></code>
              there.<br> Returns: <code class="computeroutput"><span class="identifier">c</span></code>.<br>
              <br> &#8212; If <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eq_int_type</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
              and if either the input sequence has a putback position available or
              the function makes a putback position available, decrements the next
              pointer for the input sequence, <code class="computeroutput"><span class="identifier">gptr</span><span class="special">()</span></code>.<br> Returns: <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">not_eof</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">()</span></code> to indicate failure.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Notes:</em></span> The function does not put back a character
              directly to the input sequence. If the function can succeed in more
              than one of these ways, it is unspecified which way is chosen. The
              function can alter the number of putback positions available as a result
              of any call.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">overflow</span><span class="special">(</span><span class="identifier">int_type</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">());</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Behaves according to the description
              of <code class="computeroutput"><span class="identifier">basic_streambuf</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">overflow</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>, except that the behavior of "consuming
              characters" is performed by output of the characters to the socket
              as if by one or more calls to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendmsg</span><span class="special">()</span></code></a>,
              and <code class="computeroutput"><span class="identifier">ec_</span></code> is set to reflect
              the error code produced by the operation. If the operation does not
              complete before the absolute timeout specified by <code class="computeroutput"><span class="identifier">expiry_</span></code>,
              the socket is closed and <code class="computeroutput"><span class="identifier">ec_</span></code>
              is set to <code class="computeroutput"><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">not_eof</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> to indicate success, and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">()</span></code>
              to indicate failure.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">sync</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If a put area exists, calls <code class="computeroutput"><span class="identifier">overflow</span><span class="special">(</span><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">eof</span><span class="special">())</span></code>
              to flush characters.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">streambuf</span><span class="special">*</span> <span class="identifier">setbuf</span><span class="special">(</span><span class="identifier">char_type</span><span class="special">*</span> <span class="identifier">s</span><span class="special">,</span> <span class="identifier">streamsize</span> <span class="identifier">n</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">setbuf</span><span class="special">(</span><span class="number">0</span><span class="special">,</span><span class="number">0</span><span class="special">)</span></code> is
              called on a stream before any I/O has occurred on that stream, the
              stream becomes unbuffered. Otherwise the results are unspecified. "Unbuffered"
              means that <code class="computeroutput"><span class="identifier">pbase</span><span class="special">()</span></code>
              and <code class="computeroutput"><span class="identifier">pptr</span><span class="special">()</span></code>
              always return null and output to the socket should appear as soon as
              possible.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">error_code</span> <span class="identifier">error</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">ec_</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.8.2.&#160;Class template basic_socket_iostream"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_iostream"></a>9.8.2.&#160;Class template <code class="literal">basic_socket_iostream</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">basic_socket_iostream</span> <span class="special">:</span>
        <span class="keyword">public</span> <span class="identifier">basic_iostream</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</span>

        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">time_point</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">duration</span><span class="special">;</span>

        <span class="comment">// constructors:</span>

        <span class="identifier">basic_socket_iostream</span><span class="special">();</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
          <span class="keyword">explicit</span> <span class="identifier">basic_socket_iostream</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>

        <span class="comment">// members:</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>

        <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>

        <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">StreamSocketService</span><span class="special">&gt;*</span> <span class="identifier">rdbuf</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="identifier">error_code</span> <span class="identifier">error</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
        <span class="keyword">void</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span>
          <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span> <span class="identifier">sb_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
      <span class="special">};</span>

    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The class template <code class="computeroutput"><span class="identifier">basic_socket_iostream</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code> supports reading and writing from sockets.
          It uses a <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code> object to control the associated sequences.
          For the sake of exposition, the maintained data is presented here as:
        </p><p>
          &#8212; <code class="computeroutput"><span class="identifier">sb_</span></code>, the <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span></code> object.
        </p><div class="section" title="9.8.2.1.&#160;basic_socket_iostream constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_iostream__constructors"></a>9.8.2.1.&#160;<code class="literal">basic_socket_iostream</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_socket_iostream</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_iostream</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span>
              <span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_iostream</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;(&amp;</span><span class="identifier">sb_</span><span class="special">)</span></code>, initializing <code class="computeroutput"><span class="identifier">sb_</span></code>
              with <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;()</span></code>, and performing <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">setf</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">unitbuf</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
  <span class="keyword">explicit</span> <span class="identifier">basic_socket_iostream</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_socket_iostream</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span>
              <span class="identifier">Clock</span><span class="special">,</span>
              <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code>,
              initializing the base class with <code class="computeroutput"><span class="identifier">basic_iostream</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;(&amp;</span><span class="identifier">sb_</span><span class="special">)</span></code> initializing <code class="computeroutput"><span class="identifier">sb_</span></code>
              with <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;()</span></code>, and performing <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">setf</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">unitbuf</span><span class="special">)</span></code>.
              Then calls <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)</span>...<span class="special">)</span></code>. If that function returns a null pointer,
              calls <code class="computeroutput"><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">failbit</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.8.2.2.&#160;basic_socket_iostream members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_iostream__members"></a>9.8.2.2.&#160;<code class="literal">basic_socket_iostream</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
  <span class="keyword">void</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)</span>...<span class="special">)</span></code>.
              If that function returns a null pointer, calls <code class="computeroutput"><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">failbit</span><span class="special">)</span></code> (which may throw <code class="computeroutput"><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failure</span></code>).
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">close</span><span class="special">()</span></code>. If that function returns a null
              pointer, calls <code class="computeroutput"><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">failbit</span><span class="special">)</span></code> (which may throw <code class="computeroutput"><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failure</span></code>).
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">StreamSocketService</span><span class="special">&gt;*</span> <span class="identifier">rdbuf</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">const_cast</span><span class="special">&lt;</span><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;*&gt;(&amp;</span><span class="identifier">sb_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">error</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">puberror</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">time_point</span> <span class="identifier">expiry</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">expiry</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">expires_at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_point</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">expires_after</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special">&amp;</span> <span class="identifier">d</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Calls <code class="computeroutput"><span class="identifier">rdbuf</span><span class="special">()-&gt;</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div></div><div class="section" title="9.9.&#160;Synchronous connect operations"><div class="titlepage"><div><div><h3 class="title"><a name="functions.connect"></a>9.9.&#160;Synchronous connect operations</h3></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                        <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> A default-constructed object of type <code class="computeroutput"><span class="identifier">InputIterator</span></code> is an end-of-sequence iterator.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span>
          <span class="identifier">first</span><span class="special">,</span>
          <span class="identifier">InputIterator</span><span class="special">(),</span>
          <span class="identifier">ec</span><span class="special">)</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                        <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is true, performs <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>.
          Performs <code class="computeroutput"><span class="identifier">ec</span><span class="special">.</span><span class="identifier">clear</span><span class="special">()</span></code>.
          Returns the first iterator <code class="computeroutput"><span class="identifier">i</span></code>
          in the range [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>) for which the synchronous operation
          <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(*</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">)</span></code> succeeds. If no such iterator is found,
          <code class="computeroutput"><span class="identifier">ec</span></code> contains the error code
          produced by the last unsuccessful connect operation and the function returns
          <code class="computeroutput"><span class="identifier">last</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>
          &#8212; if <code class="computeroutput"><span class="identifier">first</span> <span class="special">==</span>
          <span class="identifier">last</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                        <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                        <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> A default-constructed object of type <code class="computeroutput"><span class="identifier">InputIterator</span></code> is an end-of-sequence iterator.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span>
          <span class="identifier">first</span><span class="special">,</span>
          <span class="identifier">InputIterator</span><span class="special">(),</span>
          <span class="identifier">c</span><span class="special">,</span>
          <span class="identifier">ec</span><span class="special">)</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                        <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
  <span class="identifier">InputIterator</span> <span class="identifier">connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                        <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                        <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">ConnectCondition</span></code>
          is a function object type meeting CopyConstructible requirements (C++ Std
          [copyconstructible]).
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is true, performs <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>.
          Performs <code class="computeroutput"><span class="identifier">ec</span><span class="special">.</span><span class="identifier">clear</span><span class="special">()</span></code>.
          Returns the first iterator <code class="computeroutput"><span class="identifier">i</span></code>
          in the range [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>) for which <code class="computeroutput"><span class="identifier">c</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span>
          <span class="special">*</span><span class="identifier">i</span><span class="special">)</span></code> holds and, if so, for which the synchronous
          operation <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(*</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">)</span></code> succeeds. If no such iterator is found,
          <code class="computeroutput"><span class="identifier">ec</span></code> contains the error code
          produced by the last unsuccessful connect operation and the function returns
          <code class="computeroutput"><span class="identifier">last</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>
          &#8212; if <code class="computeroutput"><span class="identifier">first</span> <span class="special">==</span>
          <span class="identifier">last</span></code> or if the function object
          <code class="computeroutput"><span class="identifier">c</span></code> returned false for all
          iterators in the range.
        </p></blockquote></div></div><div class="section" title="9.10.&#160;Asynchronous connect operations"><div class="titlepage"><div><div><h3 class="title"><a name="functions.async_connect"></a>9.10.&#160;Asynchronous connect operations</h3></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                     <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> A default-constructed object of type <code class="computeroutput"><span class="identifier">InputIterator</span></code> is an end-of-sequence iterator.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span>
          <span class="identifier">first</span><span class="special">,</span>
          <span class="identifier">InputIterator</span><span class="special">(),</span>
          <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                     <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous operation</a>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
          <span class="identifier">ec</span><span class="special">,</span>
          <span class="identifier">InputIterator</span> <span class="identifier">i</span><span class="special">)</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is true, performs <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>.
          Initiates an asynchronous operation to determine the first iterator <code class="computeroutput"><span class="identifier">i</span></code> in the range [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>) for which the asynchronous operation
          <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">async_connect</span><span class="special">(*</span><span class="identifier">i</span><span class="special">,</span> <span class="emphasis"><em>unspecified</em></span><span class="special">)</span></code>
          succeeds. If no such iterator is found, <code class="computeroutput"><span class="identifier">ec</span></code>
          contains the error code produced by the last unsuccessful connect operation
          and <code class="computeroutput"><span class="identifier">i</span></code> contains <code class="computeroutput"><span class="identifier">last</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>
          &#8212; if <code class="computeroutput"><span class="identifier">first</span> <span class="special">==</span>
          <span class="identifier">last</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                       <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span>
                       <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                       <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> A default-constructed object of type <code class="computeroutput"><span class="identifier">InputIterator</span></code> is an end-of-sequence iterator.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span>
          <span class="identifier">first</span><span class="special">,</span>
          <span class="identifier">InputIterator</span><span class="special">(),</span>
          <span class="identifier">c</span><span class="special">,</span>
          <span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">CompletionToken</span><span class="special">&gt;(</span><span class="identifier">token</span><span class="special">))</span></code>.
        </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="keyword">auto</span> <span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">Protocol</span><span class="special">&gt;&amp;</span> <span class="identifier">s</span><span class="special">,</span>
                       <span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span>
                       <span class="identifier">ConnectCondition</span> <span class="identifier">c</span><span class="special">,</span>
                       <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
          An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous operation</a>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
          <span class="identifier">ec</span><span class="special">,</span>
          <span class="identifier">InputIterator</span> <span class="identifier">i</span><span class="special">)</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">ConnectCondition</span></code>
          is a function object type meeting CopyConstructible requirements (C++ Std
          [copyconstructible]).
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Effects:</em></span> If <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code> is true, performs <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>.
          Define <code class="computeroutput"><span class="identifier">previous_ec</span></code> as an
          object of type <code class="computeroutput"><span class="identifier">error_code</span></code>
          initialized such that <code class="computeroutput"><span class="special">!</span><span class="identifier">previous_ec</span></code>
          holds true. Initiates an asynchronous operation to determine the first
          iterator <code class="computeroutput"><span class="identifier">i</span></code> in the range
          [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>)
          for which <code class="computeroutput"><span class="identifier">c</span><span class="special">(</span><span class="identifier">previous_ec</span><span class="special">,</span>
          <span class="special">*</span><span class="identifier">i</span><span class="special">)</span></code> holds and, if so, for which the asynchronous
          operation <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">async_connect</span><span class="special">(*</span><span class="identifier">i</span><span class="special">,</span> <span class="emphasis"><em>unspecified</em></span><span class="special">)</span></code>
          succeeds. If an asynchronous operation <code class="computeroutput"><span class="identifier">s</span><span class="special">.</span><span class="identifier">async_connect</span><span class="special">(*</span><span class="identifier">i</span><span class="special">,</span>
          <span class="emphasis"><em>unspecified</em></span><span class="special">)</span></code> fails, <code class="computeroutput"><span class="identifier">previous_ec</span></code>
          is updated with the result of the operation. If no such iterator is found,
          <code class="computeroutput"><span class="identifier">ec</span></code> contains the error code
          produced by the last unsuccessful connect operation and <code class="computeroutput"><span class="identifier">i</span></code>
          contains <code class="computeroutput"><span class="identifier">last</span></code>.
        </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
          <span class="emphasis"><em>Error conditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">socket_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>
          &#8212; if <code class="computeroutput"><span class="identifier">first</span> <span class="special">==</span>
          <span class="identifier">last</span></code> or if the function object
          <code class="computeroutput"><span class="identifier">c</span></code> returned false for all
          iterators in the range.
        </p></blockquote></div></div><div class="section" title="9.11.&#160;Internet protocol"><div class="titlepage"><div><div><h3 class="title"><a name="network.internet_protocol"></a>9.11.&#160;Internet protocol</h3></div></div></div><div class="section" title="9.11.1.&#160;Header &lt;experimental/internet&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_internet___synopsis"></a>9.11.1.&#160;Header <code class="literal">&lt;experimental/internet&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">resolver_errc</span> <span class="special">{</span>
          <span class="identifier">host_not_found</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span><span class="special">,</span> <span class="comment">// <span class="emphasis"><em>EAI_NONAME</em></span></span>
          <span class="identifier">host_not_found_try_again</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span><span class="special">,</span> <span class="comment">// <span class="emphasis"><em>EAI_AGAIN</em></span></span>
          <span class="identifier">service_not_found</span> <span class="special">=</span> <span class="emphasis"><em>implementation defined</em></span> <span class="comment">// <span class="emphasis"><em>EAI_SERVICE</em></span></span>
        <span class="special">};</span>

        <span class="keyword">const</span> <span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">resolver_category</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">resolver_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">resolver_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="keyword">struct</span> <span class="identifier">v4_mapped_t</span> <span class="special">{};</span>
        <span class="keyword">constexpr</span> <span class="identifier">v4_mapped_t</span> <span class="identifier">v4_mapped</span><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__address" title="9.11.4.&#160;Class ip::address">address</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_v4" title="9.11.5.&#160;Class ip::address_v4">address_v4</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_v6" title="9.11.6.&#160;Class ip::address_v6">address_v6</a><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__bad_address_cast" title="9.11.7.&#160;Class ip::bad_address_cast">bad_address_cast</a><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address__comparisons" title="9.11.4.4.&#160;ip::address comparisons">address comparisons</a>:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v4__comparisons" title="9.11.5.6.&#160;ip::address_v4 comparisons">address_v4 comparisons</a>:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v6__comparisons" title="9.11.6.6.&#160;ip::address_v6 comparisons">address_v6 comparisons</a>:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address__creation" title="9.11.4.5.&#160;ip::address creation">address creation</a>:</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v4__creation" title="9.11.5.7.&#160;ip::address_v4 creation">address_v4 creation</a>:</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v6__creation" title="9.11.6.7.&#160;ip::address_v6 creation">address_v6 creation</a>:</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address__io" title="9.11.4.6.&#160;ip::address I/O">address I/O</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;);</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v4__io" title="9.11.5.8.&#160;ip::address_v4 I/O">address_v4 I/O</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;);</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v6__io" title="9.11.6.8.&#160;ip::address_v6 I/O">address_v6 I/O</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;);</span>

        <span class="comment">// <a class="link" href="#functions.ip__address_cast" title="9.11.8.&#160;Function ip::address_cast">address conversions</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_iterator_v4" title="9.11.10.&#160;Class template ip::address_iterator_v4">address_iterator_v4</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_iterator_v6" title="9.11.11.&#160;Class template ip::address_iterator_v6">address_iterator_v6</a><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_range_v4" title="9.11.12.&#160;Class template ip::address_range_v4">address_range_v4</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_range_v6" title="9.11.13.&#160;Class template ip::address_range_v6">address_range_v6</a><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__network_v4" title="9.11.14.&#160;Class template ip::network_v4">network_v4</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__network_v6" title="9.11.15.&#160;Class template ip::network_v6">network_v6</a><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v4__comparisons" title="9.11.14.3.&#160;ip::network_v4 comparisons">network_v4 comparisons</a>:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v6__comparisons" title="9.11.15.3.&#160;ip::network_v6 comparisons">network_v6 comparisons</a>:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v4__creation" title="9.11.14.4.&#160;ip::network_v4 creation">network_v4 creation</a>:</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v6__creation" title="9.11.15.4.&#160;ip::network_v6 creation">network_v6 creation</a>:</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v4__io" title="9.11.14.5.&#160;ip::network_v4 I/O">network_v4 I/O</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;);</span>

        <span class="comment">// <a class="link" href="#classes.ip__network_v6__io" title="9.11.15.5.&#160;ip::network_v6 I/O">network_v6 I/O</a>:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;);</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_endpoint" title="9.11.16.&#160;Class template ip::basic_endpoint">basic_endpoint</a><span class="special">;</span>

        <span class="comment">// basic_endpoint comparisons:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>

        <span class="comment">// basic_endpoint I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;,</span>
            <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;);</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__resolver_query_base" title="9.11.17.&#160;Class ip::resolver_query_base">resolver_query_base</a><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <a class="link" href="#classes.ip__basic_resolver_query" title="9.11.20.&#160;Class template ip::basic_resolver_query">basic_resolver_query</a><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <a class="link" href="#classes.ip__basic_resolver_entry" title="9.11.18.&#160;Class template ip::basic_resolver_entry">basic_resolver_entry</a><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <a class="link" href="#classes.ip__basic_resolver_iterator" title="9.11.19.&#160;Class template ip::basic_resolver_iterator">basic_resolver_iterator</a><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_resolver" title="9.11.21.&#160;Class template ip::basic_resolver">basic_resolver</a><span class="special">;</span>

        <span class="identifier">string</span> <a class="link" href="#functions.ip__host_name" title="9.11.22.&#160;Host name functions">host_name</a><span class="special">();</span>
        <span class="identifier">string</span> <a class="link" href="#functions.ip__host_name" title="9.11.22.&#160;Host name functions">host_name</a><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;);</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__tcp" title="9.11.23.&#160;Class ip::tcp">tcp</a><span class="special">;</span>

        <span class="comment">// tcp comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__udp" title="9.11.25.&#160;Class ip::udp">udp</a><span class="special">;</span>

        <span class="comment">// udp comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__v6_only" title="9.11.26.&#160;Class ip::v6_only">v6_only</a><span class="special">;</span>

        <span class="keyword">namespace</span> <span class="identifier">unicast</span> <span class="special">{</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__unicast__hops" title="9.11.27.&#160;Class ip::unicast::hops">hops</a><span class="special">;</span>

        <span class="special">}</span> <span class="comment">// namespace unicast</span>

        <span class="keyword">namespace</span> <span class="identifier">multicast</span> <span class="special">{</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__multicast__group_socket_options" title="9.11.28.&#160;Multicast group management socket options">join_group</a><span class="special">;</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__multicast__group_socket_options" title="9.11.28.&#160;Multicast group management socket options">leave_group</a><span class="special">;</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__multicast__outbound_interface" title="9.11.29.&#160;Class ip::multicast::outbound_interface">outbound_interface</a><span class="special">;</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__multicast__hops" title="9.11.30.&#160;Class ip::multicast::hops">hops</a><span class="special">;</span>

          <span class="keyword">class</span> <a class="link" href="#classes.ip__multicast__enable_loopback" title="9.11.31.&#160;Class ip::multicast::enable_loopback">enable_loopback</a><span class="special">;</span>

        <span class="special">}</span> <span class="comment">// namespace multicast</span>
      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>

  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_error_condition_enum</span><span class="special">&lt;</span>
    <span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">resolver_errc</span><span class="special">&gt;</span>
      <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>

  <span class="comment">// <a class="link" href="#classes.hash" title="9.11.9.&#160;Hash support">hash support</a></span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&gt;;</span>
  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span><span class="special">&gt;;</span>
  <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span><span class="special">&gt;;</span>

<span class="special">}</span> <span class="comment">// namespace std</span>
</pre></div><div class="section" title="9.11.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.internet_protocol_requirements"></a>9.11.2.&#160;Requirements</h4></div></div></div><div class="section" title="9.11.2.1.&#160;Internet protocol requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.internet_protocol"></a>9.11.2.1.&#160;Internet protocol requirements</h5></div></div></div><p>
            An internet protocol must meet the requirements for a <a class="link" href="#requirements.protocol" title="9.7.2.4.&#160;Protocol requirements">protocol</a>
            as well as the additional requirements listed below.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes an internet protocol class, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            and <code class="computeroutput"><span class="identifier">b</span></code> denotes a value
            of type <code class="computeroutput"><span class="identifier">X</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.internet_protocol.internet_protocol_requirements.internet_protocol.t0"></a><p class="title"><b>Table&#160;28.&#160;InternetProtocol requirements</b></p><div class="table-contents"><table class="table" summary="InternetProtocol requirements"><colgroup><col><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      return type
                    </p>
                  </th><th>
                    <p>
                      assertion/note<br> pre/post-conditions
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">resolver</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">basic_resolver</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span></code>
                    </p>
                  </td><td>
                    <p>
                      The type of a resolver for the protocol.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns an object representing the IP version 4 protocol.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns an object representing the IP version 6 protocol.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span> <span class="special">==</span>
                      <span class="identifier">b</span></code>
                    </p>
                  </td><td>
                    <p>
                      convertible to <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns whether two protocol objects are equal.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">a</span> <span class="special">!=</span>
                      <span class="identifier">b</span></code>
                    </p>
                  </td><td>
                    <p>
                      convertible to <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span>
                      <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="9.11.3.&#160;Error codes"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__resolver_errc"></a>9.11.3.&#160;Error codes</h4></div></div></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">resolver_category</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> A reference to an object of a type derived
            from class error_category.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            The object&#8217;s <code class="computeroutput"><span class="identifier">default_error_condition</span></code>
            and <code class="computeroutput"><span class="identifier">equivalent</span></code> virtual
            functions shall behave as specified for the class <code class="computeroutput"><span class="identifier">error_category</span></code>.
            The object&#8217;s <code class="computeroutput"><span class="identifier">name</span></code> virtual
            function shall return a pointer to the string <code class="computeroutput"><span class="string">"resolver"</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">resolver_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">resolver_category</span><span class="special">())</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">resolver_errc</span> <span class="identifier">e</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">resolver_category</span><span class="special">())</span></code>.
          </p></blockquote></div></div><div class="section" title="9.11.4.&#160;Class ip::address"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address"></a>9.11.4.&#160;Class <code class="literal">ip::address</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// constructors:</span>
          <span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>

          <span class="comment">// assignment:</span>
          <span class="identifier">address</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v4</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v6</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// address comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address creation:</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.4.1.&#160;ip::address constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__constructors"></a>9.11.4.1.&#160;<code class="literal">ip::address</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__address.__ip__address__constructors.t0"></a><p class="title"><b>Table&#160;29.&#160;address::address() effects</b></p><div class="table-contents"><table class="table" summary="address::address() effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">false</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">false</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">address</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
              is <code class="computeroutput"><span class="keyword">false</span></code>, and the expression
              <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span></code>
              is valid and yields an rvalue of type <code class="computeroutput"><span class="identifier">address</span></code>.
              The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code>
              shall be equivalent to <code class="computeroutput"><span class="keyword">noexcept</span><span class="special">(</span><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">))</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address</span></code> with the result of the expression
              <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> Nothing unless the expression <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)</span></code>
              throws an exception.
            </p></blockquote></div></div><div class="section" title="9.11.4.2.&#160;ip::address assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__assignment"></a>9.11.4.2.&#160;<code class="literal">ip::address</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">address</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
            </p></blockquote></div></div><div class="section" title="9.11.4.3.&#160;ip::address members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__members"></a>9.11.4.3.&#160;<code class="literal">ip::address</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_unspecified</span><span class="special">()</span></code>. If <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_unspecified</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_loopback</span><span class="special">()</span></code>. If <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_loopback</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_multicast</span><span class="special">()</span></code>. If <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">is_multicast</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v4</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if the object contains an IP version 4 address.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v6</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if the object contains an IP version 6 address.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>. If <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, returns <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(*</span><span class="keyword">this</span><span class="special">).</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</span><span class="special">)</span></code>. Otherwise throws <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.4.4.&#160;ip::address comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__comparisons"></a>9.11.4.4.&#160;<code class="literal">ip::address</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a_v4</span>
              <span class="special">==</span> <span class="identifier">b_v4</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a_v6</span>
              <span class="special">==</span> <span class="identifier">b_v6</span></code>,
              where:<br> &#8212; <code class="computeroutput"><span class="identifier">a_v4</span></code> is
              the value of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v4</span><span class="special">()</span></code>;<br>
              &#8212; <code class="computeroutput"><span class="identifier">b_v4</span></code> is <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v4</span><span class="special">()</span></code>;<br>
              &#8212; <code class="computeroutput"><span class="identifier">a_v6</span></code> is <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v6</span><span class="special">()</span></code>;
              and<br> &#8212; <code class="computeroutput"><span class="identifier">b_v6</span></code> is
              <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a_v6</span>
              <span class="special">&lt;</span> <span class="identifier">b_v6</span>
              <span class="special">||</span> <span class="identifier">a_v6</span>
              <span class="special">==</span> <span class="identifier">b_v6</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a_v4</span>
              <span class="special">&lt;</span> <span class="identifier">b_v4</span></code>,
              where:<br> &#8212; <code class="computeroutput"><span class="identifier">a_v4</span></code> is
              the value of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v4</span><span class="special">()</span></code>;<br>
              &#8212; <code class="computeroutput"><span class="identifier">b_v4</span></code> is <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v4</span><span class="special">()</span></code>;<br>
              &#8212; <code class="computeroutput"><span class="identifier">a_v6</span></code> is <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v6</span><span class="special">()</span></code>;
              and<br> &#8212; <code class="computeroutput"><span class="identifier">b_v6</span></code> is
              <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span>
              <span class="special">?</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">b</span>
              <span class="special">&lt;</span> <span class="identifier">a</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">b</span> <span class="special">&lt;</span>
              <span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">&lt;</span>
              <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.4.5.&#160;ip::address creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__creation"></a>9.11.4.5.&#160;<code class="literal">ip::address</code> creation</h5></div></div></div><pre class="programlisting"><span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts a string representation of an
              address into an object of class <code class="computeroutput"><span class="identifier">address</span></code>,
              as if by calling:
</p><pre class="programlisting"><span class="identifier">address</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">address_v6</span> <span class="identifier">v6a</span> <span class="special">=</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">ec</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">a</span> <span class="special">=</span> <span class="identifier">v6a</span><span class="special">;</span>
<span class="keyword">else</span>
<span class="special">{</span>
  <span class="identifier">address_v4</span> <span class="identifier">v4a</span> <span class="special">=</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">ec</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">a</span> <span class="special">=</span> <span class="identifier">v4a</span><span class="special">;</span>
<span class="special">}</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.4.6.&#160;ip::address I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__io"></a>9.11.4.6.&#160;<code class="literal">ip::address</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the address to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.5.&#160;Class ip::address_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_v4"></a>9.11.5.&#160;Class <code class="literal">ip::address_v4</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_v4</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">struct</span> <span class="identifier">bytes_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">);</span>
          <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>

          <span class="comment">// assignment:</span>
          <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_a</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_b</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_c</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">bytes_type</span> <span class="identifier">to_bytes</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">to_ulong</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

          <span class="comment">// static members:</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">any</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// address_v4 comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address_v4 creation:</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address_v4 I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.5.1.&#160;Struct ip::address_v4::bytes_type"><div class="titlepage"><div><div><h5 class="title"><a name="classes.struct___ip__address_v4__bytes_type_"></a>9.11.5.1.&#160;Struct <code class="literal">ip::address_v4::bytes_type</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">struct</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="special">:</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;</span>
        <span class="special">{</span>
          <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="identifier">bytes_type</span><span class="special">(</span><span class="identifier">T</span><span class="special">...</span> <span class="identifier">t</span><span class="special">)</span>
            <span class="special">:</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;{{</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)...}}</span> <span class="special">{}</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The <code class="literal">ip::address_v4::bytes_type</code> type is a standard-layout
            struct that provides a byte-level representation of an IPv4 address in
            network byte order.
          </p></div><div class="section" title="9.11.5.2.&#160;ip::address_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__constructors"></a>9.11.5.2.&#160;<code class="literal">ip::address_v4</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v4</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__address_v4.__ip__address_v4__constructors.t0"></a><p class="title"><b>Table&#160;30.&#160;address_v4::address_v4() effects</b></p><div class="table-contents"><table class="table" summary="address_v4::address_v4() effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="special">{</span><span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">}</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="number">0</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v4</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Each element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if any element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">UCHAR_MAX</span> <span class="special">==</span>
              <span class="number">0xFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">bytes</span></code> and <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">0</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">24</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">1</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">16</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">2</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">8</span><span class="special">)</span> <span class="special">|</span> <span class="identifier">bytes</span><span class="special">[</span><span class="number">3</span><span class="special">]</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">val</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFFFFFFFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if <code class="computeroutput"><span class="identifier">val</span></code> is not in the
              range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFFFFFFFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">ULONG_MAX</span> <span class="special">==</span>
              <span class="number">0xFFFFFFFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">val</span></code> and <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span></code> is <code class="computeroutput"><span class="special">{</span>
              <span class="special">(</span><span class="identifier">val</span>
              <span class="special">&gt;&gt;</span> <span class="number">24</span><span class="special">)</span> <span class="special">&amp;</span> <span class="number">0xFF</span><span class="special">,</span> <span class="special">(</span><span class="identifier">val</span> <span class="special">&gt;&gt;</span> <span class="number">16</span><span class="special">)</span> <span class="special">&amp;</span> <span class="number">0xFF</span><span class="special">,</span> <span class="special">(</span><span class="identifier">val</span> <span class="special">&gt;&gt;</span> <span class="number">8</span><span class="special">)</span> <span class="special">&amp;</span> <span class="number">0xFF</span><span class="special">,</span> <span class="identifier">val</span> <span class="special">&amp;</span>
              <span class="number">0xFF</span> <span class="special">}</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.5.3.&#160;ip::address_v4 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__assignment"></a>9.11.5.3.&#160;<code class="literal">ip::address_v4</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
            </p></blockquote></div></div><div class="section" title="9.11.5.4.&#160;ip::address_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__members"></a>9.11.5.4.&#160;<code class="literal">ip::address_v4</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xFF000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x7F000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_a</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0x80000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_b</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xC0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x80000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_class_c</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xE0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0xC0000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xF0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0xE0000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">bytes_type</span> <span class="identifier">to_bytes</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A representation of the address in <a class="link" href="#definitions.network_byte_order" title="9.1.2.&#160;network byte order">network byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">to_ulong</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A representation of the address in <a class="link" href="#definitions.host_byte_order" title="9.1.1.&#160;host byte order">host byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts an address into a string representation,
              as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_ntop.html" target="_top"><code class="computeroutput"><span class="identifier">inet_ntop</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, the string representation
              of the address. Otherwise <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.5.5.&#160;ip::address_v4 static members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__static_members"></a>9.11.5.5.&#160;<code class="literal">ip::address_v4</code> static members</h5></div></div></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">any</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="number">0x7F000001</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="number">0xFFFFFFFF</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">|</span> <span class="special">~</span><span class="identifier">mask</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">())</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.5.6.&#160;ip::address_v4 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__comparisons"></a>9.11.5.6.&#160;<code class="literal">ip::address_v4</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&gt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.5.7.&#160;ip::address_v4 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__creation"></a>9.11.5.7.&#160;<code class="literal">ip::address_v4</code> creation</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">bytes</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">val</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4_mapped</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v4</span></code>
              object corresponding to the IPv4-mapped IPv6 address, as if computed
              by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">v6b</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">();</span>
<span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="identifier">v4b</span><span class="special">(</span><span class="identifier">v6b</span><span class="special">[</span><span class="number">12</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">13</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">14</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">15</span><span class="special">]);</span>
<span class="keyword">return</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">v4b</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
              if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4_mapped</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts a string representation of an
              address into a corresponding <code class="computeroutput"><span class="identifier">address_v4</span></code>
              value, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_pton.html" target="_top"><code class="computeroutput"><span class="identifier">inet_pton</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, an <code class="computeroutput"><span class="identifier">address_v4</span></code>
              value corresponding to the string <code class="computeroutput"><span class="identifier">str</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.5.8.&#160;ip::address_v4 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__io"></a>9.11.5.8.&#160;<code class="literal">ip::address_v4</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the address to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.6.&#160;Class ip::address_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_v6"></a>9.11.6.&#160;Class <code class="literal">ip::address_v6</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_v6</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">struct</span> <span class="identifier">bytes_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>

          <span class="comment">// assignment:</span>
          <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_link_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_site_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v4_mapped</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_node_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_link_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_site_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_org_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_global</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">bytes_type</span> <span class="identifier">to_bytes</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

          <span class="comment">// static members:</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">any</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// address_v6 comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address_v6 creation:</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span>
                                             <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
        <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// address_v6 I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          [<span class="emphasis"><em>Note:</em></span> The implementations of the functions <code class="computeroutput"><span class="identifier">is_unspecified</span></code>, <code class="computeroutput"><span class="identifier">is_loopback</span></code>,
          <code class="computeroutput"><span class="identifier">is_multicast</span></code>, <code class="computeroutput"><span class="identifier">is_link_local</span></code>, <code class="computeroutput"><span class="identifier">is_site_local</span></code>,
          <code class="computeroutput"><span class="identifier">is_v4_mapped</span></code>, <code class="computeroutput"><span class="identifier">is_multicast_node_local</span></code>, <code class="computeroutput"><span class="identifier">is_multicast_link_local</span></code>, <code class="computeroutput"><span class="identifier">is_multicast_site_local</span></code>, <code class="computeroutput"><span class="identifier">is_multicast_org_local</span></code> and <code class="computeroutput"><span class="identifier">is_multicast_global</span></code> are determined by
          [RFC4291]. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.11.6.1.&#160;Struct ip::address_v6::bytes_type"><div class="titlepage"><div><div><h5 class="title"><a name="classes.struct___ip__address_v6__bytes_type_"></a>9.11.6.1.&#160;Struct <code class="literal">ip::address_v6::bytes_type</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">struct</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="special">:</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">,</span> <span class="number">16</span><span class="special">&gt;</span>
        <span class="special">{</span>
          <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="identifier">bytes_type</span><span class="special">(</span><span class="identifier">T</span><span class="special">...</span> <span class="identifier">t</span><span class="special">)</span>
            <span class="special">:</span> <span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">,</span> <span class="number">16</span><span class="special">&gt;{{</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;(</span><span class="identifier">t</span><span class="special">)...}}</span> <span class="special">{}</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
            The <code class="literal">ip::address_v6::bytes_type</code> type is a standard-layout
            struct that provides a byte-level representation of an IPv6 address in
            network byte order.
          </p></div><div class="section" title="9.11.6.2.&#160;ip::address_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__constructors"></a>9.11.6.2.&#160;<code class="literal">ip::address_v6</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v6</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__address_v6.__ip__address_v6__constructors.t0"></a><p class="title"><b>Table&#160;31.&#160;address_v6::address_v6() effects</b></p><div class="table-contents"><table class="table" summary="address_v6::address_v6() effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">is_unspecified</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">true</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="number">0</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v6</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Each element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if any element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">UCHAR_MAX</span> <span class="special">==</span>
              <span class="number">0xFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">bytes</span></code> and <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">scope</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.6.3.&#160;ip::address_v6 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__assignment"></a>9.11.6.3.&#160;<code class="literal">ip::address_v6</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
            </p></blockquote></div></div><div class="section" title="9.11.6.4.&#160;ip::address_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__members"></a>9.11.6.4.&#160;<code class="literal">ip::address_v6</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">id</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The scope identifier associated with
              the address.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents an unspecified
              address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">3</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">4</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">5</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">6</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">7</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">8</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">9</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">10</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">11</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">12</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">13</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">14</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">15</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a loopback
              address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">3</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">4</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">5</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">6</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">7</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">8</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">9</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">10</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">11</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">12</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">13</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">14</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">15</span><span class="special">]</span> <span class="special">==</span> <span class="number">1</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_link_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a unicast
              link-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFE</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0xC0</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x80</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_site_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a unicast
              site-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFE</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0xC0</span><span class="special">)</span> <span class="special">==</span> <span class="number">0xC0</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_v4_mapped</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents an IPv4-mapped
              IPv6 address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">3</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">4</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">5</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">6</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">7</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">8</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">9</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">10</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">11</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_node_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              node-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x01</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_link_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              link-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x02</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_site_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              site-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x05</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_org_local</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              organization-local address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x08</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast_global</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              global address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x0E</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">bytes_type</span> <span class="identifier">to_bytes</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A representation of the address in <a class="link" href="#definitions.network_byte_order" title="9.1.2.&#160;network byte order">network byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts an address into a string representation.
              If <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">0</span></code>,
              converts as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_ntop.html" target="_top"><code class="computeroutput"><span class="identifier">inet_ntop</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET6</span></code>.
              If <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">!=</span> <span class="number">0</span></code>,
              the format is <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span><code class="computeroutput"><span class="special">%</span></code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>,
              where <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              is the string representation of the equivalent address having <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">0</span></code>,
              and <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is an implementation-defined string representation of the scope identifier.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, the string representation
              of the address. Otherwise <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.6.5.&#160;ip::address_v6 static members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__static_members"></a>9.11.6.5.&#160;<code class="literal">ip::address_v6</code> static members</h5></div></div></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">any</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An address <code class="computeroutput"><span class="identifier">a</span></code>
              such that the condition <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_loopback</span><span class="special">()</span></code> holds.
            </p></blockquote></div></div><div class="section" title="9.11.6.6.&#160;ip::address_v6 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__comparisons"></a>9.11.6.6.&#160;<code class="literal">ip::address_v6</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">||</span> <span class="special">(!(</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">())</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">a</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">b</span>
              <span class="special">&lt;</span> <span class="identifier">a</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">b</span> <span class="special">&lt;</span>
              <span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">&lt;</span>
              <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.6.7.&#160;ip::address_v6 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__creation"></a>9.11.6.7.&#160;<code class="literal">ip::address_v6</code> creation</h5></div></div></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span>
                                     <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">(</span><span class="identifier">bytes</span><span class="special">,</span> <span class="identifier">scope_id</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v6</span></code>
              object containing the IPv4-mapped IPv6 address corresponding to the
              specified IPv4 address, as if computed by the following method:
</p><pre class="programlisting"><span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="identifier">v4b</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">();</span>
<span class="identifier">bytes_type</span> <span class="identifier">v6b</span><span class="special">(</span><span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span>
               <span class="number">0xFF</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">,</span> <span class="identifier">v4b</span><span class="special">[</span><span class="number">0</span><span class="special">],</span> <span class="identifier">v4b</span><span class="special">[</span><span class="number">1</span><span class="special">],</span> <span class="identifier">v4b</span><span class="special">[</span><span class="number">2</span><span class="special">],</span> <span class="identifier">v4b</span><span class="special">[</span><span class="number">3</span><span class="special">]);</span>
<span class="keyword">return</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="identifier">v6b</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts a string representation of an
              address into a corresponding <code class="computeroutput"><span class="identifier">address_v6</span></code>
              value. The format is either <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              or <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span><code class="computeroutput"><span class="special">%</span></code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>,
              where <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              is in the format specified by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_pton.html" target="_top"><code class="computeroutput"><span class="identifier">inet_pton</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET6</span></code>,
              and <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is an optional string specifying the scope identifier. All implementations
              shall accept as <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              a string representation of an unsigned decimal integer. It is implementation-defined
              whether alternative scope identifier representations are permitted.
              If <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is not supplied, an <code class="computeroutput"><span class="identifier">address_v6</span></code>
              object shall be returned such that <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, an <code class="computeroutput"><span class="identifier">address_v6</span></code>
              value corresponding to the string <code class="computeroutput"><span class="identifier">str</span></code>.
              Otherwise returns <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.6.8.&#160;ip::address_v6 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__io"></a>9.11.6.8.&#160;<code class="literal">ip::address_v6</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the address to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.7.&#160;Class ip::bad_address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__bad_address_cast"></a>9.11.7.&#160;Class <code class="literal">ip::bad_address_cast</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">bad_address_cast</span> <span class="special">:</span> <span class="identifier">bad_cast</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Objects of type <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
          are thrown by a failed <code class="computeroutput"><span class="identifier">address_cast</span></code>.
        </p></div><div class="section" title="9.11.8.&#160;Function ip::address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="functions.ip__address_cast"></a>9.11.8.&#160;Function <code class="literal">ip::address_cast</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            This function template shall participate in overload resolution only
            for the types <code class="computeroutput"><span class="identifier">T</span></code> listed
            in the table below.
          </p></blockquote></div><div class="table"><a name="functions.proposed_text.internet_protocol.ip__address_cast.t0"></a><p class="title"><b>Table&#160;32.&#160;template&lt;class T&gt; constexpr T address_cast(const address&amp;)
          effects</b></p><div class="table-contents"><table class="table" summary="template&lt;class T&gt; constexpr T address_cast(const address&amp;)
          effects"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    T
                  </p>
                </th><th>
                  <p>
                    noexcept
                  </p>
                </th><th>
                  <p>
                    remarks
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns <code class="computeroutput"><span class="identifier">a</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v4</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">false</span></code>
                  </p>
                </td><td>
                  <p>
                    If <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, returns
                    the IP version 4 address specified in the version-independent
                    address object <code class="computeroutput"><span class="identifier">a</span></code>.
                    Otherwise, throws <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">false</span></code>
                  </p>
                </td><td>
                  <p>
                    If <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, returns
                    the IP version 6 address specified in the version-independent
                    address object <code class="computeroutput"><span class="identifier">a</span></code>.
                    Otherwise, throws <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            This function template shall participate in overload resolution only
            for the types <code class="computeroutput"><span class="identifier">T</span></code> listed
            in the table below.
          </p></blockquote></div><div class="table"><a name="functions.proposed_text.internet_protocol.ip__address_cast.t1"></a><p class="title"><b>Table&#160;33.&#160;template&lt;class T&gt; constexpr T address_cast(const address_v4&amp;)
          effects</b></p><div class="table-contents"><table class="table" summary="template&lt;class T&gt; constexpr T address_cast(const address_v4&amp;)
          effects"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    T
                  </p>
                </th><th>
                  <p>
                    noexcept
                  </p>
                </th><th>
                  <p>
                    remarks
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns a version-independent <code class="computeroutput"><span class="identifier">address</span></code>
                    object <code class="computeroutput"><span class="identifier">b</span></code> such
                    that <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">false</span></code>, and <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span>
                    <span class="special">==</span> <span class="identifier">a</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v4</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns <code class="computeroutput"><span class="identifier">a</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v6</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    Function overload is deleted.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">constexpr</span> <span class="identifier">T</span> <span class="identifier">address_cast</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            This function template shall participate in overload resolution only
            for the types <code class="computeroutput"><span class="identifier">T</span></code> listed
            in the table below.
          </p></blockquote></div><div class="table"><a name="functions.proposed_text.internet_protocol.ip__address_cast.t2"></a><p class="title"><b>Table&#160;34.&#160;template&lt;class T&gt; constexpr T address_cast(const address_v6&amp;)
          effects</b></p><div class="table-contents"><table class="table" summary="template&lt;class T&gt; constexpr T address_cast(const address_v6&amp;)
          effects"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    T
                  </p>
                </th><th>
                  <p>
                    noexcept
                  </p>
                </th><th>
                  <p>
                    remarks
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns a version-independent <code class="computeroutput"><span class="identifier">address</span></code>
                    object <code class="computeroutput"><span class="identifier">b</span></code> such
                    that <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, and <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">)</span>
                    <span class="special">==</span> <span class="identifier">a</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v4</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    Function overload is deleted.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns <code class="computeroutput"><span class="identifier">a</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.11.9.&#160;Hash support"><div class="titlepage"><div><div><h4 class="title"><a name="classes.hash"></a>9.11.9.&#160;Hash support</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&gt;;</span>
<span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span><span class="special">&gt;;</span>
<span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span><span class="special">&gt;;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Requires:</em></span> the template specializations shall meet
            the requirements of class template <code class="computeroutput"><span class="identifier">hash</span></code>
            (C++ Std [unord.hash]).
          </p></blockquote></div></div><div class="section" title="9.11.10.&#160;Class template ip::address_iterator_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_iterator_v4"></a>9.11.10.&#160;Class template <code class="literal">ip::address_iterator_v4</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_iterator_v4</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">address_v4</span> <span class="identifier">value_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">ptrdiff_t</span> <span class="identifier">difference_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">reference</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">input_iterator_tag</span> <span class="identifier">iterator_category</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">address_iterator_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// other members as required by C++ Std [input.iterators]</span>

        <span class="keyword">private</span><span class="special">:</span>
          <span class="identifier">address_v4</span> <span class="identifier">address_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.10.1.&#160;ip::address_iterator_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_iterator_v4__constructors"></a>9.11.10.1.&#160;<code class="literal">ip::address_iterator_v4</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">address_iterator_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_iterator_v4</span></code>, initializing
              <code class="computeroutput"><span class="identifier">address_</span></code> with <code class="computeroutput"><span class="identifier">a</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.10.2.&#160;ip::address_iterator_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_iterator_v4__members"></a>9.11.10.2.&#160;<code class="literal">ip::address_iterator_v4</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">address_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the next unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the next unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prior value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the prior unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the prior unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prior value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.11.&#160;Class template ip::address_iterator_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_iterator_v6"></a>9.11.11.&#160;Class template <code class="literal">ip::address_iterator_v6</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_iterator_v6</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">address_v6</span> <span class="identifier">value_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">ptrdiff_t</span> <span class="identifier">difference_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">reference</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">input_iterator_tag</span> <span class="identifier">iterator_category</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">address_iterator_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// other members as required by C++ Std [input.iterators]</span>

        <span class="keyword">private</span><span class="special">:</span>
          <span class="identifier">address_v6</span> <span class="identifier">address_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.11.1.&#160;ip::address_iterator_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_iterator_v6__constructors"></a>9.11.11.1.&#160;<code class="literal">ip::address_iterator_v6</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">address_iterator_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_iterator_v6</span></code>, initializing
              <code class="computeroutput"><span class="identifier">address_</span></code> with <code class="computeroutput"><span class="identifier">a</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.11.2.&#160;ip::address_iterator_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_iterator_v6__members"></a>9.11.11.2.&#160;<code class="literal">ip::address_iterator_v6</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">address_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the next unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the next unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prior value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the prior unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_iterator_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Sets <code class="computeroutput"><span class="identifier">address_</span></code>
              to the prior unique address in network byte order.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prior value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.12.&#160;Class template ip::address_range_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_range_v4"></a>9.11.12.&#160;Class template <code class="literal">ip::address_range_v4</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_range_v4</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">address_iterator_v4</span> <span class="identifier">iterator</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">address_range_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_range_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.12.1.&#160;ip::address_range_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_range_v4__constructors"></a>9.11.12.1.&#160;<code class="literal">ip::address_range_v4</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">address_range_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_range_v4</span></code> representing an
              empty range.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_range_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_range_v4</span></code> representing the
              half open range [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>).
            </p></blockquote></div></div><div class="section" title="9.11.12.2.&#160;ip::address_range_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_range_v4__members"></a>9.11.12.2.&#160;<code class="literal">ip::address_range_v4</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator that points to the beginning
              of the range.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator that points to the end of
              the range.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              represents an empty range, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The number of unique addresses in the
              range.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">addr</span></code>
              is in the range, an iterator that points to <code class="computeroutput"><span class="identifier">addr</span></code>;
              otherwise, <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.13.&#160;Class template ip::address_range_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_range_v6"></a>9.11.13.&#160;Class template <code class="literal">ip::address_range_v6</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">address_range_v6</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">address_iterator_v6</span> <span class="identifier">iterator</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">address_range_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_range_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                           <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.13.1.&#160;ip::address_range_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_range_v6__constructors"></a>9.11.13.1.&#160;<code class="literal">ip::address_range_v6</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">address_range_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_range_v6</span></code> representing an
              empty range.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_range_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                 <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of type <code class="computeroutput"><span class="identifier">address_range_v6</span></code> representing the
              half open range [<code class="computeroutput"><span class="identifier">first</span></code>,<code class="computeroutput"><span class="identifier">last</span></code>).
            </p></blockquote></div></div><div class="section" title="9.11.13.2.&#160;ip::address_range_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_range_v6__members"></a>9.11.13.2.&#160;<code class="literal">ip::address_range_v6</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator that points to the beginning
              of the range.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An iterator that points to the end of
              the range.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              represents an empty range, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">addr</span></code>
              is in the range, an iterator that points to <code class="computeroutput"><span class="identifier">addr</span></code>;
              otherwise, <code class="computeroutput"><span class="identifier">end</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.14.&#160;Class template ip::network_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__network_v4"></a>9.11.14.&#160;Class template <code class="literal">ip::network_v4</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">network_v4</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// constructors:</span>
          <span class="identifier">network_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
          <span class="identifier">network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">);</span>

          <span class="comment">// members:</span>
          <span class="identifier">address_v4</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_length</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_v4</span> <span class="identifier">netmask</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_v4</span> <span class="identifier">network</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_range_v4</span> <span class="identifier">hosts</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">network_v4</span> <span class="identifier">canonical</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">is_host</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">is_subnet_of</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// network_v4 comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// network_v4 creation:</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// network_v4 I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.14.1.&#160;ip::network_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v4__constructors"></a>9.11.14.1.&#160;<code class="literal">ip::network_v4</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">network_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">().</span><span class="identifier">is_unspecified</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code> and <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">prefix_len</span>
              <span class="special">&lt;=</span> <span class="number">32</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">addr</span></code> and <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">prefix_len</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if <code class="computeroutput"><span class="identifier">prefix_len</span> <span class="special">&gt;</span>
              <span class="number">32</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Starting from the most significant bit
              in network byte order, <code class="computeroutput"><span class="identifier">mask</span></code>
              contains zero or more contiguous non-zero bits. All other bits are
              zero.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">addr</span></code> and <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span></code> is equal to the number of contiguous
              non-zero bits.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">invalid_argument</span></code>
              if <code class="computeroutput"><span class="identifier">mask</span></code> contains non-contiguous
              non-zero bits, or if the most significant bit is zero and any other
              bits are non-zero.
            </p></blockquote></div></div><div class="section" title="9.11.14.2.&#160;ip::network_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v4__members"></a>9.11.14.2.&#160;<code class="literal">ip::network_v4</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The address specified when the <code class="computeroutput"><span class="identifier">network_v4</span></code> object was constructed.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_length</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prefix length of the network.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">netmask</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v4</span></code>
              object with <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span></code> contiguous non-zero bits set, starting
              from the most significant bit in network byte order. All other bits
              are zero.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">network</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v4</span></code>
              object with the first <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span></code> bits, starting from the most significant
              bit in network byte order, set to the corresponding bit value of <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>.
              All other bits are zero.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v4</span></code>
              object with the first <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span></code> bits, starting from the most significant
              bit in network byte order, set to the corresponding bit value of <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>.
              All other bits are non-zero.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_range_v4</span> <span class="identifier">hosts</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_host</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, an <code class="computeroutput"><span class="identifier">address_range_v4</span></code>
              object representing the single address <code class="computeroutput"><span class="identifier">address</span><span class="special">().</span></code> Otherwise, an <code class="computeroutput"><span class="identifier">address_range_v4</span></code>
              object representing the range of unique host IP addresses in the network.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v4</span> <span class="identifier">canonical</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">network_v4</span><span class="special">(</span><span class="identifier">network</span><span class="special">(),</span> <span class="identifier">prefix_length</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_host</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">32</span></code>,
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_subnet_of</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">prefix_length</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">network_v4</span><span class="special">(</span><span class="identifier">address</span><span class="special">(),</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()).</span><span class="identifier">canonical</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">canonical</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A string <code class="computeroutput"><span class="identifier">s</span></code>
              computed as if by:<br>
</p><pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">address</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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">s</span> <span class="special">+=</span> <span class="char">'/'</span> <span class="special">+</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">prefix_length</span><span class="special">());</span>
</pre><p>
            </p></blockquote></div></div><div class="section" title="9.11.14.3.&#160;ip::network_v4 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__comparisons"></a>9.11.14.3.&#160;<code class="literal">ip::network_v4</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span></code>,
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.14.4.&#160;ip::network_v4 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__creation"></a>9.11.14.4.&#160;<code class="literal">ip::network_v4</code> creation</h5></div></div></div><pre class="programlisting"><span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">network_v4</span><span class="special">(</span><span class="identifier">addr</span><span class="special">,</span> <span class="identifier">prefix_len</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">mask</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">network_v4</span><span class="special">(</span><span class="identifier">addr</span><span class="special">,</span> <span class="identifier">mask</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">str</span></code>
              contains a value of the form <span class="emphasis"><em>address</em></span> <code class="computeroutput"><span class="char">'/'</span></code> <span class="emphasis"><em>prefix-length</em></span>,
              a <code class="computeroutput"><span class="identifier">network_v4</span></code> object
              constructed with the result of applying <code class="computeroutput"><span class="identifier">make_address_v4</span><span class="special">()</span></code> to the <span class="emphasis"><em>address</em></span>
              portion of the string, and the result of converting <span class="emphasis"><em>prefix-length</em></span>
              to an integer of type <code class="computeroutput"><span class="keyword">unsigned</span>
              <span class="keyword">short</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">network_v4</span><span class="special">()</span></code>
              and sets <code class="computeroutput"><span class="identifier">ec</span></code> to reflect
              the error.
            </p></blockquote></div></div><div class="section" title="9.11.14.5.&#160;ip::network_v4 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__io"></a>9.11.14.5.&#160;<code class="literal">ip::network_v4</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v4</span><span class="special">&amp;</span> <span class="identifier">net</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the network to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">net</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.15.&#160;Class template ip::network_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__network_v6"></a>9.11.15.&#160;Class template <code class="literal">ip::network_v6</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">network_v6</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// constructors:</span>
          <span class="identifier">network_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>

          <span class="comment">// members:</span>
          <span class="identifier">address_v6</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_length</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_v6</span> <span class="identifier">network</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_range_v6</span> <span class="identifier">hosts</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">network_v6</span> <span class="identifier">canonical</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">is_host</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">bool</span> <span class="identifier">is_subnet_of</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// network_v6 comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// network_v6 creation:</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

        <span class="comment">// network_v6 I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.15.1.&#160;ip::network_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v6__constructors"></a>9.11.15.1.&#160;<code class="literal">ip::network_v6</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">network_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">().</span><span class="identifier">is_unspecified</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code> and <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">prefix_len</span>
              <span class="special">&lt;=</span> <span class="number">128</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">addr</span></code> and <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">prefix_len</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if <code class="computeroutput"><span class="identifier">prefix_len</span> <span class="special">&gt;</span>
              <span class="number">128</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.15.2.&#160;ip::network_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v6__members"></a>9.11.15.2.&#160;<code class="literal">ip::network_v6</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v6</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The address specified when the <code class="computeroutput"><span class="identifier">network_v6</span></code> object was constructed.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_length</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The prefix length of the network.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v6</span> <span class="identifier">network</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v6</span></code>
              object with the first <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span></code> bits, starting from the most significant
              bit in network byte order, set to the corresponding bit value of <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>.
              All other bits are zero.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_range_v6</span> <span class="identifier">hosts</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">is_host</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, an <code class="computeroutput"><span class="identifier">address_range_v6</span></code>
              object representing the single address <code class="computeroutput"><span class="identifier">address</span><span class="special">().</span></code> Otherwise, an <code class="computeroutput"><span class="identifier">address_range_v6</span></code>
              object representing the range of unique host IP addresses in the network.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v6</span> <span class="identifier">canonical</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">network_v6</span><span class="special">(</span><span class="identifier">network</span><span class="special">(),</span> <span class="identifier">prefix_length</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_host</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">128</span></code>,
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_subnet_of</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">prefix_length</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">network_v6</span><span class="special">(</span><span class="identifier">address</span><span class="special">(),</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()).</span><span class="identifier">canonical</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">canonical</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A string <code class="computeroutput"><span class="identifier">s</span></code>
              computed as if by:<br>
</p><pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">address</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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">s</span> <span class="special">+=</span> <span class="char">'/'</span> <span class="special">+</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">prefix_length</span><span class="special">());</span>
</pre><p>
            </p></blockquote></div></div><div class="section" title="9.11.15.3.&#160;ip::network_v6 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__comparisons"></a>9.11.15.3.&#160;<code class="literal">ip::network_v6</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">prefix_length</span><span class="special">()</span></code>,
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.15.4.&#160;ip::network_v6 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__creation"></a>9.11.15.4.&#160;<code class="literal">ip::network_v6</code> creation</h5></div></div></div><pre class="programlisting"><span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">prefix_len</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">network_v6</span><span class="special">(</span><span class="identifier">addr</span><span class="special">,</span> <span class="identifier">prefix_len</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">str</span></code>
              contains a value of the form <span class="emphasis"><em>address</em></span> <code class="computeroutput"><span class="char">'/'</span></code> <span class="emphasis"><em>prefix-length</em></span>,
              a <code class="computeroutput"><span class="identifier">network_v6</span></code> object
              constructed with the result of applying <code class="computeroutput"><span class="identifier">make_address_v6</span><span class="special">()</span></code> to the <span class="emphasis"><em>address</em></span>
              portion of the string, and the result of converting <span class="emphasis"><em>prefix-length</em></span>
              to an integer of type <code class="computeroutput"><span class="keyword">unsigned</span>
              <span class="keyword">short</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">network_v6</span><span class="special">()</span></code>
              and sets <code class="computeroutput"><span class="identifier">ec</span></code> to reflect
              the error.
            </p></blockquote></div></div><div class="section" title="9.11.15.5.&#160;ip::network_v6 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__io"></a>9.11.15.5.&#160;<code class="literal">ip::network_v6</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">network_v6</span><span class="special">&amp;</span> <span class="identifier">net</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the network to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">net</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</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="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.16.&#160;Class template ip::basic_endpoint"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_endpoint"></a>9.11.16.&#160;Class template <code class="literal">ip::basic_endpoint</code></h4></div></div></div><p>
          Instances of the <code class="computeroutput"><span class="identifier">basic_endpoint</span></code>
          class template meet the requirements for an <a class="link" href="#requirements.endpoint" title="9.7.2.3.&#160;Endpoint requirements"><code class="computeroutput"><span class="identifier">Endpoint</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_endpoint</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">InternetProtocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">basic_endpoint</span><span class="special">();</span>
          <span class="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">InternetProtocol</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
                         <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>
          <span class="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span>
                         <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>

          <span class="comment">// members:</span>
          <span class="identifier">InternetProtocol</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">void</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
          <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">void</span> <span class="identifier">port</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>
        <span class="special">};</span>

        <span class="comment">// basic_endpoint comparisons:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                          <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>

        <span class="comment">// basic_endpoint I/O:</span>
        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
          <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
            <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">ep</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_endpoint</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">();</span>
          <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
          <span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
        <span class="keyword">private</span><span class="special">:</span>
//        sockaddr_storage data_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.16.1.&#160;ip::basic_endpoint constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__constructors"></a>9.11.16.1.&#160;<code class="literal">ip::basic_endpoint</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_endpoint</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__basic_endpoint.__ip__basic_endpoint__constructors.t0"></a><p class="title"><b>Table&#160;35.&#160;basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint() effects</b></p><div class="table-contents"><table class="table" summary="basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint() effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span><span class="special">())</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">port</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="number">0</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">InternetProtocol</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
               <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              with the specified protocol and port number.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__basic_endpoint.__ip__basic_endpoint__constructors.t1"></a><p class="title"><b>Table&#160;36.&#160;basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint(const InternetProtocol&amp;,
            unsigned short) effects</b></p><div class="table-contents"><table class="table" summary="basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint(const InternetProtocol&amp;,
            unsigned short) effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span><span class="special">())</span></code>
                      if <code class="computeroutput"><span class="identifier">proto</span> <span class="special">==</span>
                      <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>,
                      otherwise <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span><span class="special">())</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">port</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">port_num</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">,</span>
               <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              with the specified address and port number.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__basic_endpoint.__ip__basic_endpoint__constructors.t2"></a><p class="title"><b>Table&#160;37.&#160;basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint(const ip::address&amp;,
            unsigned short) effects</b></p><div class="table-contents"><table class="table" summary="basic_endpoint&lt;InternetProtocol&gt;::basic_endpoint(const ip::address&amp;,
            unsigned short) effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">addr</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">port</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">port_num</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.11.16.2.&#160;ip::basic_endpoint members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__members"></a>9.11.16.2.&#160;<code class="literal">ip::basic_endpoint</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">InternetProtocol</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code> if the expression <code class="computeroutput"><span class="identifier">address</span><span class="special">().</span><span class="identifier">is_v6</span><span class="special">()</span></code> is true, otherwise <code class="computeroutput"><span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span> <span class="identifier">address</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The address associated with the endpoint.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Modifies the address associated with
              the endpoint.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">addr</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The port number associated with the endpoint.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">port</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">port_num</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Modifies the port number associated with
              the endpoint.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">port</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">port_num</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.16.3.&#160;ip::basic_endpoint comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__comparisons"></a>9.11.16.3.&#160;<code class="literal">ip::basic_endpoint</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">port</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">port</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span>
              <span class="special">||</span> <span class="special">(!(</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">address</span><span class="special">())</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">a</span><span class="special">.</span><span class="identifier">port</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">port</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">b</span>
              <span class="special">&lt;</span> <span class="identifier">a</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">b</span> <span class="special">&lt;</span>
              <span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">a</span><span class="special">,</span>
                  <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">&lt;</span>
              <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.16.4.&#160;ip::basic_endpoint I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__i_o"></a>9.11.16.4.&#160;<code class="literal">ip::basic_endpoint</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span>
    <span class="keyword">const</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;&amp;</span> <span class="identifier">ep</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs a representation of the endpoint
              to the stream, as if it were implemented as follows:
</p><pre class="programlisting"><span class="identifier">basic_ostringstream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;</span> <span class="identifier">ss</span><span class="special">;</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">ep</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">v6</span><span class="special">())</span>
  <span class="identifier">ss</span> <span class="special">&lt;&lt;</span> <span class="identifier">ss</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(</span><span class="char">'['</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">ss</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">ss</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(</span><span class="char">']'</span><span class="special">);</span>
<span class="keyword">else</span>
  <span class="identifier">ss</span> <span class="special">&lt;&lt;</span> <span class="identifier">ep</span><span class="special">.</span><span class="identifier">address</span><span class="special">();</span>
<span class="identifier">ss</span> <span class="special">&lt;&lt;</span> <span class="identifier">ss</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(</span><span class="char">':'</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">ep</span><span class="special">.</span><span class="identifier">port</span><span class="special">();</span>
<span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">ss</span><span class="special">.</span><span class="identifier">str</span><span class="special">();</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div><p>
            [<span class="emphasis"><em>Note:</em></span> The representation of the endpoint when it
            contains an IP version 6 address is based on [<a class="link" href="#ref-RFC2732">RFC2732</a>].
            &#8212;<span class="emphasis"><em>end note</em></span>]
          </p></div><div class="section" title="9.11.16.5.&#160;ip::basic_endpoint members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__members__extensible_implementations_"></a>9.11.16.5.&#160;<code class="literal">ip::basic_endpoint</code> members (extensible implementations)</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">data_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">data_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">sockaddr_in6</span><span class="special">)</span></code> if <code class="computeroutput"><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET</span></code>, otherwise <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">sockaddr_in</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">length_error</span></code>
              if the condition <code class="computeroutput"><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET6</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">s</span> <span class="special">!=</span>
              <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">sockaddr_in6</span><span class="special">)</span></code>
              <code class="computeroutput"><span class="special">||</span></code> <code class="computeroutput"><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">family</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">AF_INET6</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">s</span> <span class="special">!=</span>
              <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">sockaddr_in</span><span class="special">)</span></code>
              is true.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_t</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">data_</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.17.&#160;Class ip::resolver_query_base"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__resolver_query_base"></a>9.11.17.&#160;Class <code class="literal">ip::resolver_query_base</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">resolver_query_base</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="keyword">typedef</span> <span class="emphasis"><em><span class="bold"><strong>T1</strong></span></em></span> <span class="identifier">flags</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">passive</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">canonical_name</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">numeric_host</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">numeric_service</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">v4_mapped</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">all_matching</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="keyword">const</span> <span class="identifier">flags</span> <span class="identifier">address_configured</span><span class="special">;</span>

        <span class="keyword">protected</span><span class="special">:</span>
          <span class="identifier">resolver_query_base</span><span class="special">();</span>
          <span class="special">~</span><span class="identifier">resolver_query_base</span><span class="special">();</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          <code class="computeroutput"><span class="identifier">resolver_query_base</span></code> defines
          a bitmask type, <code class="computeroutput"><span class="identifier">flags</span></code>.
          The flags constants have bitwise-distinct values. The meanings and <span class="emphasis"><em>POSIX</em></span>
          equivalents for each flag are defined in the table below.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__resolver_query_base.t0"></a><p class="title"><b>Table&#160;38.&#160;resolver flags</b></p><div class="table-contents"><table class="table" summary="resolver flags"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    flag
                  </p>
                </th><th>
                  <p>
                    meaning
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>POSIX</em></span> equivalent
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">passive</span></code>
                  </p>
                </td><td>
                  <p>
                    Returned endpoints are intended for use as locally bound socket
                    endpoints.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_PASSIVE</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">canonical_name</span></code>
                  </p>
                </td><td>
                  <p>
                    Determine the canonical name of the host specified in the query.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_CANONNAME</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">numeric_host</span></code>
                  </p>
                </td><td>
                  <p>
                    Host name should be treated as a numeric string defining an IPv4
                    or IPv6 address and no host name resolution should be attempted.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_NUMERICHOST</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">numeric_service</span></code>
                  </p>
                </td><td>
                  <p>
                    Service name should be treated as a numeric string defining a
                    port number and no service name resolution should be attempted.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_NUMERICSERV</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">v4_mapped</span></code>
                  </p>
                </td><td>
                  <p>
                    If the query protocol is specified as an IPv6 protocol, return
                    IPv4-mapped IPv6 addresses on finding no IPv6 addresses.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_V4MAPPED</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">all_matching</span></code>
                  </p>
                </td><td>
                  <p>
                    If used with <code class="computeroutput"><span class="identifier">v4_mapped</span></code>,
                    return all matching IPv6 and IPv4 addresses.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_ALL</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_configured</span></code>
                  </p>
                </td><td>
                  <p>
                    Only return IPv4 addresses if a non-loopback IPv4 address is
                    configured for the system. Only return IPv6 addresses if a non-loopback
                    IPv6 address is configured for the system.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_ADDRCONFIG</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.11.18.&#160;Class template ip::basic_resolver_entry"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver_entry"></a>9.11.18.&#160;Class template <code class="literal">ip::basic_resolver_entry</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_resolver_entry</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">InternetProtocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">InternetProtocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">basic_resolver_entry</span><span class="special">();</span>
          <span class="identifier">basic_resolver_entry</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">ep</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">h</span><span class="special">,</span>
                               <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">);</span>

          <span class="comment">// members:</span>
          <span class="identifier">endpoint_type</span> <span class="identifier">endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">operator</span> <span class="identifier">endpoint_type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">host_name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">service_name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.18.1.&#160;ip::basic_resolver_entry constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_entry__constructors"></a>9.11.18.1.&#160;<code class="literal">ip::basic_resolver_entry</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_resolver_entry</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__basic_resolver_entry.__ip__basic_resolver_entry__constructors.t0"></a><p class="title"><b>Table&#160;39.&#160;basic_resolver_entry&lt;InternetProtocol&gt;::basic_resolver_entry()
            effects</b></p><div class="table-contents"><table class="table" summary="basic_resolver_entry&lt;InternetProtocol&gt;::basic_resolver_entry()
            effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">endpoint</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;()</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">host_name</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">service_name</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="identifier">basic_resolver_entry</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">ep</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">h</span><span class="special">,</span>
                     <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              with the specified endpoint, host name and service name.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="classes.proposed_text.internet_protocol.ip__basic_resolver_entry.__ip__basic_resolver_entry__constructors.t1"></a><p class="title"><b>Table&#160;40.&#160;basic_resolver_entry&lt;InternetProtocol&gt;::basic_resolver_entry()
            effects</b></p><div class="table-contents"><table class="table" summary="basic_resolver_entry&lt;InternetProtocol&gt;::basic_resolver_entry()
            effects"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">endpoint</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">ep</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">host_name</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">h</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">service_name</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">s</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="9.11.18.2.&#160;ip::basic_resolver_entry members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_entry__members"></a>9.11.18.2.&#160;<code class="literal">ip::basic_resolver_entry</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">endpoint</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The endpoint associated with the resolver
              entry.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">operator</span> <span class="identifier">endpoint_type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">endpoint</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">host_name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The host name associated with the resolver
              entry.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">service_name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The service name associated with the
              resolver entry.
            </p></blockquote></div></div></div><div class="section" title="9.11.19.&#160;Class template ip::basic_resolver_iterator"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver_iterator"></a>9.11.19.&#160;Class template <code class="literal">ip::basic_resolver_iterator</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_resolver_iterator</span> <span class="special">:</span>
          <span class="keyword">public</span> <span class="identifier">iterator</span><span class="special">&lt;</span><span class="identifier">forward_iterator_tag</span><span class="special">,</span>
            <span class="keyword">const</span> <span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span> <span class="special">&gt;</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">InternetProtocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">InternetProtocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">basic_resolver_iterator</span><span class="special">();</span>

          <span class="comment">// other members as required by C++ Std [forward.iterators]</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.19.1.&#160;ip::basic_resolver_iterator constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_iterator__constructors"></a>9.11.19.1.&#160;<code class="literal">ip::basic_resolver_iterator</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_resolver_iterator</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initializes an object of class <code class="computeroutput"><span class="identifier">basic_resolver_iterator</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              so that it represents an end iterator.
            </p></blockquote></div></div></div><div class="section" title="9.11.20.&#160;Class template ip::basic_resolver_query"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver_query"></a>9.11.20.&#160;Class template <code class="literal">ip::basic_resolver_query</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_resolver_query</span> <span class="special">:</span>
          <span class="keyword">public</span> <span class="identifier">resolver_query_base</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">InternetProtocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">basic_resolver_query</span><span class="special">();</span>
          <span class="identifier">basic_resolver_query</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">service_name</span><span class="special">,</span>
                               <span class="identifier">flags</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">passive</span> <span class="special">|</span> <span class="identifier">address_configured</span><span class="special">);</span>
          <span class="identifier">basic_resolver_query</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">InternetProtocol</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
                               <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">service_name</span><span class="special">,</span>
                               <span class="identifier">flags</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">passive</span> <span class="special">|</span> <span class="identifier">address_configured</span><span class="special">);</span>
          <span class="identifier">basic_resolver_query</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">host_name</span><span class="special">,</span>
                               <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">service_name</span><span class="special">,</span>
                               <span class="identifier">flags</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">address_configured</span><span class="special">);</span>
          <span class="identifier">basic_resolver_query</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">InternetProtocol</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
                               <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">host_name</span><span class="special">,</span>
                               <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">service_name</span><span class="special">,</span>
                               <span class="identifier">flags</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">address_configured</span><span class="special">);</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          The <code class="computeroutput"><span class="identifier">basic_resolver_query</span></code>
          class encapsulates values used in name resolution. The meanings of the
          constructor arguments are defined below as if the name resolution is performed
          using <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>:
        </p><p>
          &#8212; <span class="emphasis"><em>proto</em></span> is used to populate the <code class="computeroutput"><span class="identifier">ai_family</span></code>,
          <code class="computeroutput"><span class="identifier">ai_socktype</span></code> and <code class="computeroutput"><span class="identifier">ai_protocol</span></code> fields of the <code class="computeroutput"><span class="identifier">addrinfo</span></code> structure passed as the <span class="emphasis"><em>hints</em></span>
          argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
        </p><p>
          &#8212; <span class="emphasis"><em>host_name</em></span> is passed as the <span class="emphasis"><em>nodename</em></span>
          argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
        </p><p>
          &#8212; <span class="emphasis"><em>service_name</em></span> is passed as the <span class="emphasis"><em>servname</em></span>
          argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
        </p><p>
          &#8212; <span class="emphasis"><em>flags</em></span> is used to populate the <code class="computeroutput"><span class="identifier">ai_flags</span></code>
          field of the <code class="computeroutput"><span class="identifier">addrinfo</span></code> structure
          passed as the <span class="emphasis"><em>hints</em></span> argument to <span class="emphasis"><em>POSIX</em></span>
          <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
        </p><p>
          If a default-constructed <code class="computeroutput"><span class="identifier">basic_resolver_query</span></code>
          object is used in a call to <code class="computeroutput"><span class="identifier">basic_resolver</span><span class="special">&lt;&gt;::</span><span class="identifier">resolve</span><span class="special">()</span></code>, the results are undefined.
        </p></div><div class="section" title="9.11.21.&#160;Class template ip::basic_resolver"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver"></a>9.11.21.&#160;Class template <code class="literal">ip::basic_resolver</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InternetProtocol</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <span class="identifier">basic_resolver</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>

          <span class="keyword">typedef</span> <span class="identifier">io_service</span><span class="special">::</span><span class="identifier">executor_type</span> <span class="identifier">executor_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">InternetProtocol</span> <span class="identifier">protocol_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">InternetProtocol</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">endpoint_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_resolver_query</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span> <span class="identifier">query</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_resolver_iterator</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span> <span class="identifier">iterator</span><span class="special">;</span>

          <span class="comment">// construct / copy / destroy:</span>

          <span class="keyword">explicit</span> <span class="identifier">basic_resolver</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
          <span class="identifier">basic_resolver</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_resolver</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
          <span class="identifier">basic_resolver</span><span class="special">(</span><span class="identifier">basic_resolver</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

          <span class="special">~</span><span class="identifier">basic_resolver</span><span class="special">();</span>

          <span class="identifier">basic_resolver</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">basic_resolver</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
          <span class="identifier">basic_resolver</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_resolver</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

          <span class="comment">// basic_resolver operations:</span>

          <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>

          <span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">);</span>
          <span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

          <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
            <span class="keyword">auto</span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

          <span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>
          <span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>

          <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
            <span class="keyword">auto</span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span>
                               <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="section" title="9.11.21.1.&#160;ip::basic_resolver constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__constructors"></a>9.11.21.1.&#160;<code class="literal">ip::basic_resolver</code> constructors</h5></div></div></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_resolver</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">&amp;</span> <span class="identifier">ios</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">basic_resolver</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_resolver</span><span class="special">(</span><span class="identifier">basic_resolver</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Move constructs an object of class <code class="computeroutput"><span class="identifier">basic_resolver</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              that refers to the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.21.2.&#160;ip::basic_resolver destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__destructor"></a>9.11.21.2.&#160;<code class="literal">ip::basic_resolver</code> destructor</h5></div></div></div><pre class="programlisting"><span class="special">~</span><span class="identifier">basic_resolver</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Destroys the resolver, cancelling any
              asynchronous operations associated with the resolver as if by calling
              <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.21.3.&#160;ip::basic_resolver assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__assignment"></a>9.11.21.3.&#160;<code class="literal">ip::basic_resolver</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">basic_resolver</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_resolver</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Cancels any outstanding asynchronous
              operations associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as if by calling <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>,
              then moves into <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              the state originally represented by <code class="computeroutput"><span class="identifier">rhs</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ios</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="9.11.21.4.&#160;ip::basic_resolver operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__operations"></a>9.11.21.4.&#160;<code class="literal">ip::basic_resolver</code> operations</h5></div></div></div><pre class="programlisting"><span class="identifier">executor_type</span><span class="special">&amp;</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The associated executor.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">cancel</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Causes any outstanding asynchronous resolve
              operations to complete as soon as possible. Handlers for cancelled
              operations shall be passed an error code <code class="computeroutput"><span class="identifier">ec</span></code>
              such that <code class="computeroutput"><span class="identifier">ec</span> <span class="special">==</span>
              <span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_canceled</span></code> holds true.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">);</span>
<span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Translates a query into a sequence of
              <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code> objects, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, an iterator object <code class="computeroutput"><span class="identifier">i</span></code> such that the condition <code class="computeroutput"><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iterator</span><span class="special">()</span></code>
              holds. Otherwise <code class="computeroutput"><span class="identifier">iterator</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">query</span><span class="special">&amp;</span> <span class="identifier">q</span><span class="special">,</span> <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">iterator</span> <span class="identifier">i</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              translate a query into a sequence of <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code> objects, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getaddrinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getaddrinfo</span><span class="special">()</span></code></a>.
              If the operation completes successfully, the handler is passed an iterator
              object <code class="computeroutput"><span class="identifier">i</span></code> such that
              the condition <code class="computeroutput"><span class="identifier">i</span> <span class="special">!=</span>
              <span class="identifier">iterator</span><span class="special">()</span></code>
              holds. Otherwise, <code class="computeroutput"><span class="identifier">i</span></code>
              is <code class="computeroutput"><span class="identifier">iterator</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">);</span>
<span class="identifier">iterator</span> <span class="identifier">resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Translates an endpoint into a sequence
              of zero or one <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code> objects, as if by <span class="emphasis"><em>POSIX</em></span>
              <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getnameinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getnameinfo</span><span class="special">()</span></code></a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, an iterator object <code class="computeroutput"><span class="identifier">i</span></code> such that the condition <code class="computeroutput"><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iterator</span><span class="special">()</span></code>
              holds. Otherwise <code class="computeroutput"><span class="identifier">iterator</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="keyword">auto</span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">,</span>
                     <span class="identifier">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              An <a class="link" href="#requirements.asynchronous_operations" title="9.3.6.1.&#160;Requirements on asynchronous operations">asynchronous
              operation</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Completion signature:</em></span> <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span>
              <span class="identifier">ec</span><span class="special">,</span>
              <span class="identifier">iterator</span> <span class="identifier">i</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Initiates an asynchronous operation to
              translate an endpoint into a sequence of zero or one <code class="computeroutput"><span class="identifier">basic_resolver_entry</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code>
              objects, as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/getnameinfo.html" target="_top"><code class="computeroutput"><span class="identifier">getnameinfo</span><span class="special">()</span></code></a>.
              If the operation completes successfully, the handler is passed an iterator
              object <code class="computeroutput"><span class="identifier">i</span></code> such that
              the condition <code class="computeroutput"><span class="identifier">i</span> <span class="special">!=</span>
              <span class="identifier">iterator</span><span class="special">()</span></code>
              holds. Otherwise, <code class="computeroutput"><span class="identifier">i</span></code>
              is <code class="computeroutput"><span class="identifier">iterator</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.22.&#160;Host name functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.ip__host_name"></a>9.11.22.&#160;Host name functions</h4></div></div></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">host_name</span><span class="special">();</span>
<span class="identifier">string</span> <span class="identifier">host_name</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Returns:</em></span> The standard host name for the current
            machine, determined as if by <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/000095399/functions/gethostname.html" target="_top"><code class="computeroutput"><span class="identifier">gethostname</span><span class="special">()</span></code></a>.
          </p></blockquote></div></div><div class="section" title="9.11.23.&#160;Class ip::tcp"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__tcp"></a>9.11.23.&#160;Class <code class="literal">ip::tcp</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">tcp</span></code> class meets the
          requirements for an <a class="link" href="#requirements.internet_protocol" title="9.11.2.1.&#160;Internet protocol requirements"><code class="computeroutput"><span class="identifier">InternetProtocol</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">tcp</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">tcp</span><span class="special">&gt;</span> <span class="identifier">endpoint</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_resolver</span><span class="special">&lt;</span><span class="identifier">tcp</span><span class="special">&gt;</span> <span class="identifier">resolver</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">tcp</span><span class="special">&gt;</span> <span class="identifier">socket</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">tcp</span><span class="special">&gt;</span> <span class="identifier">acceptor</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_socket_iostream</span><span class="special">&lt;</span><span class="identifier">tcp</span><span class="special">&gt;</span> <span class="identifier">iostream</span><span class="special">;</span>
          <span class="keyword">class</span> <a class="link" href="#classes.ip__tcp__no_delay" title="9.11.24.&#160;Class ip::tcp::no_delay">no_delay</a><span class="special">;</span>

          <span class="comment">// static members:</span>
          <span class="keyword">static</span> <span class="identifier">tcp</span> <span class="identifier">v4</span><span class="special">();</span>
          <span class="keyword">static</span> <span class="identifier">tcp</span> <span class="identifier">v6</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="comment">// not defined</span>
        <span class="special">};</span>

        <span class="comment">// tcp comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">tcp</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="keyword">int</span> <span class="identifier">family</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">int</span> <span class="identifier">type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">int</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          In the table below, <code class="computeroutput"><span class="identifier">u</span></code> denotes
          an identifier.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__tcp.t0"></a><p class="title"><b>Table&#160;41.&#160;Behaviour of extensible implementations</b></p><div class="table-contents"><table class="table" summary="Behaviour of extensible implementations"><colgroup><col><col></colgroup><thead><tr><th>
                  <p>
                    expression
                  </p>
                </th><th>
                  <p>
                    value
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AF_INET</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_STREAM</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_TCP</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AF_INET6</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_STREAM</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_TCP</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">AF_INET</span></code>,
          <code class="computeroutput"><span class="identifier">AF_INET6</span></code> and <code class="computeroutput"><span class="identifier">SOCK_STREAM</span></code> are defined in the <span class="emphasis"><em>POSIX</em></span>
          header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. The constant <code class="computeroutput"><span class="identifier">IPPROTO_TCP</span></code> is defined in the <span class="emphasis"><em>POSIX</em></span>
          header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.11.23.1.&#160;ip::tcp comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__tcp__comparisons"></a>9.11.23.1.&#160;<code class="literal">ip::tcp</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether two objects
              of class <code class="computeroutput"><span class="identifier">tcp</span></code> are equal,
              such that the expression <code class="computeroutput"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span></code>
              is true, the expression <code class="computeroutput"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
              is true, and the expression <code class="computeroutput"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">tcp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">tcp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.24.&#160;Class ip::tcp::no_delay"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__tcp__no_delay"></a>9.11.24.&#160;Class <code class="literal">ip::tcp::no_delay</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">no_delay</span></code> class represents
          a socket option for disabling the Nagle algorithm for coalescing small
          segments. It shall be defined as a <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">boolean
          socket option</a> with the name and values in the table below:
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__tcp__no_delay.t0"></a><p class="title"><b>Table&#160;42.&#160;tcp::no_delay boolean socket option</b></p><div class="table-contents"><table class="table" summary="tcp::no_delay boolean socket option"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">no_delay</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_TCP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">TCP_NODELAY</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constant <code class="computeroutput"><span class="identifier">IPPROTO_TCP</span></code>
          is defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          The constant <code class="computeroutput"><span class="identifier">TCP_NODELAY</span></code>
          is defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/tcp.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">tcp</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p></div><div class="section" title="9.11.25.&#160;Class ip::udp"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__udp"></a>9.11.25.&#160;Class <code class="literal">ip::udp</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">udp</span></code> class meets the
          requirements for an <a class="link" href="#requirements.internet_protocol" title="9.11.2.1.&#160;Internet protocol requirements"><code class="computeroutput"><span class="identifier">InternetProtocol</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">udp</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="comment">// types:</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_endpoint</span><span class="special">&lt;</span><span class="identifier">udp</span><span class="special">&gt;</span> <span class="identifier">endpoint</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_resolver</span><span class="special">&lt;</span><span class="identifier">udp</span><span class="special">&gt;</span> <span class="identifier">resolver</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">basic_datagram_socket</span><span class="special">&lt;</span><span class="identifier">udp</span><span class="special">&gt;</span> <span class="identifier">socket</span><span class="special">;</span>

          <span class="comment">// static members:</span>
          <span class="keyword">static</span> <span class="identifier">udp</span> <span class="identifier">v4</span><span class="special">();</span>
          <span class="keyword">static</span> <span class="identifier">udp</span> <span class="identifier">v6</span><span class="special">();</span>

        <span class="keyword">private</span><span class="special">:</span>
          <span class="identifier">udp</span><span class="special">();</span> <span class="comment">// not defined</span>
        <span class="special">};</span>

        <span class="comment">// udp comparisons:</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
        <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>

        <span class="keyword">class</span> <span class="identifier">udp</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="keyword">int</span> <span class="identifier">family</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">int</span> <span class="identifier">type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="keyword">int</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          In the table below, <code class="computeroutput"><span class="identifier">u</span></code> denotes
          an identifier.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__udp.t0"></a><p class="title"><b>Table&#160;43.&#160;Behaviour of extensible implementations</b></p><div class="table-contents"><table class="table" summary="Behaviour of extensible implementations"><colgroup><col><col></colgroup><thead><tr><th>
                  <p>
                    expression
                  </p>
                </th><th>
                  <p>
                    value
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AF_INET</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_UDP</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AF_INET6</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</span></code>
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">());</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_UDP</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">AF_INET</span></code>,
          <code class="computeroutput"><span class="identifier">AF_INET6</span></code> and <code class="computeroutput"><span class="identifier">SOCK_DGRAM</span></code> are defined in the <span class="emphasis"><em>POSIX</em></span>
          header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html" target="_top"><code class="computeroutput"><span class="identifier">sys</span><span class="special">/</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">h</span></code></a>. The constant <code class="computeroutput"><span class="identifier">IPPROTO_UDP</span></code> is defined in the <span class="emphasis"><em>POSIX</em></span>
          header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="9.11.25.1.&#160;ip::udp comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__udp__comparisons"></a>9.11.25.1.&#160;<code class="literal">ip::udp</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether two objects
              of class <code class="computeroutput"><span class="identifier">udp</span></code> are equal,
              such that the expression <code class="computeroutput"><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span></code>
              is true, the expression <code class="computeroutput"><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
              is true, and the expression <code class="computeroutput"><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">udp</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">udp</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.26.&#160;Class ip::v6_only"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__v6_only"></a>9.11.26.&#160;Class <code class="literal">ip::v6_only</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">v6_only</span></code> class represents
          a socket option for determining whether a socket created for an IPv6 protocol
          is restricted to IPv6 communications only. It shall be defined as a <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">boolean socket option</a>
          with the name and values in the table below:
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__v6_only.t0"></a><p class="title"><b>Table&#160;44.&#160;v6_only boolean socket option</b></p><div class="table-contents"><table class="table" summary="v6_only boolean socket option"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">v6_only</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_V6ONLY</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
          and <code class="computeroutput"><span class="identifier">IPV6_V6ONLY</span></code> are defined
          in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p></div><div class="section" title="9.11.27.&#160;Class ip::unicast::hops"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__unicast__hops"></a>9.11.27.&#160;Class <code class="literal">ip::unicast::hops</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">hops</span></code> class represents
          a socket option for specifying the default number of hops (also known as
          time-to-live or TTL) on outbound datagrams. It shall be defined as an
          <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">integral socket
          option</a> with the name and values in the table below:
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__unicast__hops.t0"></a><p class="title"><b>Table&#160;45.&#160;hops integral socket option</b></p><div class="table-contents"><table class="table" summary="hops integral socket option"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">unicast</span><span class="special">::</span><span class="identifier">hops</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_UNICAST_HOPS</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IP_TTL</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>,
          <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> and <code class="computeroutput"><span class="identifier">IPV6_UNICAST_HOPS</span></code> are defined in the
          <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          Where is <code class="computeroutput"><span class="identifier">IP_TTL</span></code> in <span class="emphasis"><em>POSIX</em></span>?
        </p></div><p>
          Constructors for the <code class="computeroutput"><span class="identifier">hops</span></code>
          class shall throw <code class="computeroutput"><span class="identifier">out_of_range</span></code>
          if the argument is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">255</span><span class="special">]</span></code>.
        </p></div><div class="section" title="9.11.28.&#160;Multicast group management socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__group_socket_options"></a>9.11.28.&#160;Multicast group management socket options</h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">join_group</span></code> and <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">leave_group</span></code>
          classes are socket options for multicast group management.
        </p><p>
          Multicast group management socket option classes satisfy the requirements
          for <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>,
          <code class="computeroutput"><span class="identifier">Assignable</span></code>, and <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><p>
          [<span class="emphasis"><em>Example:</em></span> Creating a UDP socket and joining a multicast
          group:
</p><pre class="programlisting"><span class="comment">// Open an IPv4 UDP socket bound to a specific port.</span>
<span class="identifier">ip</span><span class="special">::</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">endpoint</span> <span class="identifier">ep</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">v4</span><span class="special">(),</span> <span class="number">12345</span><span class="special">);</span>
<span class="identifier">ip</span><span class="special">::</span><span class="identifier">udp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">sock</span><span class="special">(</span><span class="identifier">io_svc</span><span class="special">,</span> <span class="identifier">ep</span><span class="special">);</span>

<span class="comment">// Join a multicast group.</span>
<span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span> <span class="identifier">addr</span> <span class="special">=</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">::</span><span class="identifier">from_string</span><span class="special">(</span><span class="string">"239.255.0.1"</span><span class="special">);</span>
<span class="identifier">sock</span><span class="special">.</span><span class="identifier">set_option</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">join_group</span><span class="special">(</span><span class="identifier">addr</span><span class="special">));</span>
</pre><p>
          &#8212;<span class="emphasis"><em>end example</em></span>]
        </p><p>
          Multicast group management socket option classes shall be defined as follows:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="comment">// constructors:</span>
  <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
  <span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">);</span>
  <span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">,</span>
             <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">network_interface</span> <span class="special">=</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">any</span><span class="special">());</span>
  <span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">,</span>
             <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">network_interface</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
<span class="special">};</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">class</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
<span class="keyword">private</span><span class="special">:</span>
//ip_mreq v4_value_;    <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
//ipv6_mreq v6_value_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
<span class="special">};</span>
</pre><p>
          The names and values used in the definition of the multicast group management
          socket option classes are described in the table below.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__group_socket_options.t0"></a><p class="title"><b>Table&#160;46.&#160;Multicast group management socket options</b></p><div class="table-contents"><table class="table" summary="Multicast group management socket options"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th><th>
                  <p>
                    description
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">join_group</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_JOIN_GROUP</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IP_ADD_MEMBERSHIP</span></code>.
                  </p>
                </td><td>
                  <p>
                    Used to join a multicast group.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">leave_group</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_LEAVE_GROUP</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IP_DROP_MEMBERSHIP</span></code>.
                  </p>
                </td><td>
                  <p>
                    Used to leave a multicast group.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>
          and <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> are defined
          in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          The constants <code class="computeroutput"><span class="identifier">IPV6_JOIN_GROUP</span></code>
          and <code class="computeroutput"><span class="identifier">IPV6_LEAVE_GROUP</span></code> are
          defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          Where are <code class="computeroutput"><span class="identifier">IP_ADD_MEMBERSHIP</span></code>
          and <code class="computeroutput"><span class="identifier">IP_DROP_MEMBERSHIP</span></code>
          in <span class="emphasis"><em>POSIX</em></span>?
        </p></div><div class="section" title="9.11.28.1.&#160;Multicast group management socket option constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.multicast_group_management_socket_option_constructors"></a>9.11.28.1.&#160;Multicast group management socket option constructors</h5></div></div></div><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, both
              <code class="computeroutput"><span class="identifier">v4_value_</span></code> and <code class="computeroutput"><span class="identifier">v6_value_</span></code> are zero-initialized.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, if <code class="computeroutput"><span class="identifier">multicast_group</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span></code>
              is true then <code class="computeroutput"><span class="identifier">v6_value_</span><span class="special">.</span><span class="identifier">ipv6mr_multiaddr</span></code>
              is initialized to correspond to the IPv6 address returned by <code class="computeroutput"><span class="identifier">multicast_group</span><span class="special">.</span><span class="identifier">to_v6</span><span class="special">()</span></code>,
              <code class="computeroutput"><span class="identifier">v6_value_</span><span class="special">.</span><span class="identifier">ipv6mr_interface</span></code> is set to <code class="computeroutput"><span class="number">0</span></code>, and <code class="computeroutput"><span class="identifier">v4_value_</span></code>
              is zero-initialized; otherwise, <code class="computeroutput"><span class="identifier">v4_value_</span><span class="special">.</span><span class="identifier">imr_multiaddr</span></code>
              is initialized to correspond to the IPv4 address returned by <code class="computeroutput"><span class="identifier">multicast_group</span><span class="special">.</span><span class="identifier">to_v4</span><span class="special">()</span></code>,
              <code class="computeroutput"><span class="identifier">v4_value_</span><span class="special">.</span><span class="identifier">imr_interface</span></code> is zero-initialized,
              and <code class="computeroutput"><span class="identifier">v6_value_</span></code> is zero-initialized.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">,</span>
           <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">network_interface</span> <span class="special">=</span> <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">any</span><span class="special">());</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, <code class="computeroutput"><span class="identifier">v4_value_</span><span class="special">.</span><span class="identifier">imr_multiaddr</span></code> is initialized to correspond
              to the address <code class="computeroutput"><span class="identifier">multicast_group</span></code>,
              <code class="computeroutput"><span class="identifier">v4_value_</span><span class="special">.</span><span class="identifier">imr_interface</span></code> is initialized to correspond
              to address <code class="computeroutput"><span class="identifier">network_interface</span></code>,
              and <code class="computeroutput"><span class="identifier">v6_value_</span></code> is zero-initialized.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">multicast_group</span><span class="special">,</span>
           <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">network_interface</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, <code class="computeroutput"><span class="identifier">v6_value_</span><span class="special">.</span><span class="identifier">ipv6mr_multiaddr</span></code> is initialized to
              correspond to the address <code class="computeroutput"><span class="identifier">multicast_group</span></code>,
              <code class="computeroutput"><span class="identifier">v6_value_</span><span class="special">.</span><span class="identifier">ipv6mr_interface</span></code> is initialized to
              <code class="computeroutput"><span class="identifier">network_interface</span></code>,
              and <code class="computeroutput"><span class="identifier">v4_value_</span></code> is zero-initialized.
            </p></blockquote></div></div><div class="section" title="9.11.28.2.&#160;Multicast group management socket option members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.multicast_group_management_socket_option_members__extensible_implementations_"></a>9.11.28.2.&#160;Multicast group management socket option members (extensible implementations)</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">L</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <span class="emphasis"><em><span class="bold"><strong><code class="computeroutput"><span class="identifier">N</span></code></strong></span></em></span>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">v6_value_</span></code> if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET6</span></code>, otherwise <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">v4_value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">v6_value_</span><span class="special">)</span></code> if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET6</span></code>, otherwise <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">v4_value_</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.29.&#160;Class ip::multicast::outbound_interface"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__outbound_interface"></a>9.11.29.&#160;Class <code class="literal">ip::multicast::outbound_interface</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">outbound_interface</span></code>
          class represents a socket option that specifies the network interface to
          use for outgoing multicast datagrams.
        </p><p>
          <code class="computeroutput"><span class="identifier">outbound_interface</span></code> satisfies
          the requirements for <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>,
          <code class="computeroutput"><span class="identifier">Assignable</span></code>, and <a class="link" href="#requirements.settable_socket_option" title="9.7.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>
        <span class="keyword">namespace</span> <span class="identifier">multicast</span> <span class="special">{</span>

          <span class="keyword">class</span> <span class="identifier">outbound_interface</span>
          <span class="special">{</span>
          <span class="keyword">public</span><span class="special">:</span>
            <span class="comment">// constructors:</span>
            <span class="identifier">outbound_interface</span><span class="special">();</span>
            <span class="keyword">explicit</span> <span class="identifier">outbound_interface</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">network_interface</span><span class="special">);</span>
            <span class="keyword">explicit</span> <span class="identifier">outbound_interface</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">network_interface</span><span class="special">);</span>
          <span class="special">};</span>

        <span class="special">}</span> <span class="comment">// namespace multicast</span>
      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Extensible implementations shall provide the following member functions:
        </p><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    inline namespace network_v1 {
      <span class="keyword">namespace</span> <span class="identifier">ip</span> <span class="special">{</span>
        <span class="keyword">namespace</span> <span class="identifier">multicast</span> <span class="special">{</span>

          <span class="keyword">class</span> <span class="identifier">outbound_interface</span>
          <span class="special">{</span>
          <span class="keyword">public</span><span class="special">:</span>
            <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
            <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
            <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
            <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
            <span class="emphasis"><em><span class="bold"><strong>// remainder unchanged</strong></span></em></span>
          <span class="keyword">private</span><span class="special">:</span>
//          in_addr v4_value_;       <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
//          unsigned int v6_value_;  <span class="emphasis"><em><span class="bold"><strong>exposition only</strong></span></em></span>
          <span class="special">};</span>

        <span class="special">}</span> <span class="comment">// namespace multicast</span>
      <span class="special">}</span> <span class="comment">// namespace ip</span>
    } // inline namespace network_v1
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><div class="sidebar"><p class="title"><b></b></p><p>
          The <code class="computeroutput"><span class="identifier">outbound_interface</span></code>
          class is a <code class="computeroutput"><span class="identifier">SettableSocketOption</span></code>
          only, unlike its <span class="emphasis"><em>POSIX</em></span> equivalents which are both
          gettable and settable. This is to avoid the need for additional classes
          that provide a protocol independent representation of a network interface.
        </p></div><div class="section" title="9.11.29.1.&#160;ip::multicast::outbound_interface constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__multicast__outbound_interface__constructors"></a>9.11.29.1.&#160;<code class="literal">ip::multicast::outbound_interface</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">outbound_interface</span><span class="special">();</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, both
              <code class="computeroutput"><span class="identifier">v4_value_</span></code> and <code class="computeroutput"><span class="identifier">v6_value_</span></code> are zero-initialized.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">outbound_interface</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">network_interface</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, <code class="computeroutput"><span class="identifier">v4_value_</span></code> is initialized to correspond
              to the IPv4 address <code class="computeroutput"><span class="identifier">network_interface</span></code>,
              and <code class="computeroutput"><span class="identifier">v6_value_</span></code> is zero-initialized.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">outbound_interface</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">network_interface</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> For extensible implementations, <code class="computeroutput"><span class="identifier">v6_value_</span></code> is initialized to <code class="computeroutput"><span class="identifier">network_interface</span></code>, and <code class="computeroutput"><span class="identifier">v4_value_</span></code> is zero-initialized.
            </p></blockquote></div></div><div class="section" title="9.11.29.2.&#160;ip::multicast::outbound_interface members (extensible implementations)"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__multicast__outbound_interface__members__extensible_implementations_"></a>9.11.29.2.&#160;<code class="literal">ip::multicast::outbound_interface</code> members (extensible
          implementations)</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
              if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
              otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>
              and <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> are
              defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">int</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_IF</span></code>
              if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
              otherwise <code class="computeroutput"><span class="identifier">IP_MULTICAST_IF</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> The constant <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_IF</span></code>
              is defined in the <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            Where is <code class="computeroutput"><span class="identifier">IP_MULTICAST_IF</span></code>
            in <span class="emphasis"><em>POSIX</em></span>?
          </p></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="emphasis"><em>unspecified</em></span><span class="special">*</span> <span class="identifier">data</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">v6_value_</span></code> if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET6</span></code>, otherwise <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">v4_value_</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Protocol</span><span class="special">&gt;</span> <span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Protocol</span><span class="special">&amp;</span> <span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">v6_value_</span><span class="special">)</span></code> if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">AF_INET6</span></code>, otherwise <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">v4_value_</span><span class="special">)</span></code>.
            </p></blockquote></div></div></div><div class="section" title="9.11.30.&#160;Class ip::multicast::hops"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__hops"></a>9.11.30.&#160;Class <code class="literal">ip::multicast::hops</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">hops</span></code> class represents
          a socket option for specifying the default number of hops (also known as
          time-to-live or TTL) on outbound multicast datagrams. It shall be defined
          as an <a class="link" href="#classes.socket_base__int_socket_options" title="9.7.6.&#160;Integral socket options">integral
          socket option</a> with the name and values in the table below:
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__hops.t0"></a><p class="title"><b>Table&#160;47.&#160;hops integral socket option</b></p><div class="table-contents"><table class="table" summary="hops integral socket option"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">hops</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_HOPS</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IP_MULTICAST_TTL</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>,
          <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> and <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_HOPS</span></code> are defined in the
          <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          Where is <code class="computeroutput"><span class="identifier">IP_MULTICAST_TTL</span></code>
          in <span class="emphasis"><em>POSIX</em></span>?
        </p></div><p>
          Constructors for the <code class="computeroutput"><span class="identifier">hops</span></code>
          class shall throw <code class="computeroutput"><span class="identifier">out_of_range</span></code>
          if the argument is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">255</span><span class="special">]</span></code>.
        </p></div><div class="section" title="9.11.31.&#160;Class ip::multicast::enable_loopback"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__enable_loopback"></a>9.11.31.&#160;Class <code class="literal">ip::multicast::enable_loopback</code></h4></div></div></div><p>
          The <code class="computeroutput"><span class="identifier">enable_loopback</span></code> class
          represents a socket option for determining whether multicast datagrams
          are delivered back to the local application. It shall be defined as a
          <a class="link" href="#classes.socket_base__bool_socket_options" title="9.7.5.&#160;Boolean socket options">boolean socket
          option</a> with the name and values in the table below:
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__enable_loopback.t0"></a><p class="title"><b>Table&#160;48.&#160;enable_loopback boolean socket option</b></p><div class="table-contents"><table class="table" summary="enable_loopback boolean socket option"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">multicast</span><span class="special">::</span><span class="identifier">enable_loopback</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>.
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_LOOP</span></code>
                    if <code class="computeroutput"><span class="identifier">p</span><span class="special">.</span><span class="identifier">family</span><span class="special">()</span>
                    <span class="special">==</span> <span class="identifier">AF_INET6</span></code>,
                    otherwise <code class="computeroutput"><span class="identifier">IP_MULTICAST_LOOP</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><p>
          [<span class="emphasis"><em>Note:</em></span> The constants <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>,
          <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> and <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_LOOP</span></code> are defined in the
          <span class="emphasis"><em>POSIX</em></span> header file <a href="http://www.opengroup.org/onlinepubs/000095399/basedefs/netinet/in.h.html" target="_top"><code class="computeroutput"><span class="identifier">netinet</span><span class="special">/</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">h</span></code></a>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          Where is <code class="computeroutput"><span class="identifier">IP_MULTICAST_LOOP</span></code>
          in <span class="emphasis"><em>POSIX</em></span>?
        </p></div></div></div></div><div class="section" title="10.&#160;References"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.references"></a>10.&#160;References</h2></div></div></div><p>
      <a name="ref-POSIX"></a>[POSIX] <span class="emphasis"><em>ISO/IEC 9945:2003</em></span>, <span class="emphasis"><em>IEEE
      Std 1003.1-2001</em></span>, and <span class="emphasis"><em>The Open Group Base Specifications,
      Issue 6</em></span>. Also known as <span class="emphasis"><em>The Single Unix Specification,
      Version 3</em></span>.
    </p><p>
      <a name="ref-N4045"></a>[N4045] Kohlhoff, Christopher, <span class="emphasis"><em>Library Foundations
      for Asynchronous Operations, Revision 2</em></span>, 2014.
    </p><p>
      <a name="ref-N4046"></a>[N4046] Kohlhoff, Christopher, <span class="emphasis"><em>Executors
      and Asynchronous Operations</em></span>, 2014.
    </p><p>
      <a name="ref-N4099"></a>[N4099] <span class="emphasis"><em>Draft Filesystem Technical Specification</em></span>,
      2014.
    </p><p>
      <a name="ref-ACE"></a>[ACE] Schmidt, Douglas C., <span class="emphasis"><em>ADAPTIVE Communication
      Environment</em></span>, <a href="http://www.cs.wustl.edu/~schmidt/ACE.html" target="_top">http://www.cs.wustl.edu/~schmidt/ACE.html</a>.
    </p><p>
      <a name="ref-SYMBIAN"></a>[SYMBIAN] Symbian Ltd, <span class="emphasis"><em>Sockets Client</em></span>,
      <a href="http://www.symbian.com/developer/techlib/v70sdocs/doc_source/reference/cpp/SocketsClient/index.html" target="_top">http://www.symbian.com/developer/techlib/v70sdocs/doc_source/reference/cpp/SocketsClient/index.html</a>.
    </p><p>
      <a name="ref-MS-NET"></a>[MS-NET] Microsoft Corporation, <span class="emphasis"><em>.NET Framework
      Class Library, Socket Class</em></span>, <a href="http://msdn2.microsoft.com/en-us/library/system.net.sockets.socket.aspx" target="_top">http://msdn2.microsoft.com/en-us/library/system.net.sockets.socket.aspx</a>.
    </p><p>
      <a name="ref-ES-API"></a>[ES-API] The Interconnect Software Consortium / The
      Open Group, <span class="emphasis"><em>Extended Sockets API (ES-API), Issue 1.0</em></span>,
      2005, <a href="http://opengroup.org/icsc/uploads/40/6415/ES_API_1_0.pdf" target="_top">http://opengroup.org/icsc/uploads/40/6415/ES_API_1_0.pdf</a>.
    </p><p>
      <a name="ref-UNPV1"></a>[UNPV1] Stevens, W. Richard, <span class="emphasis"><em>UNIX Network
      Programming, Volume 1, 2nd Edition</em></span>, Prentice Hall, 1998.
    </p><p>
      <a name="ref-POSA2"></a>[POSA2] Schmidt, Douglas C. et al, <span class="emphasis"><em>Pattern
      Oriented Software Architecture, Volume 2</em></span>, Wiley, 2000.
    </p><p>
      <a name="ref-RFC821"></a>[RFC821] Postel, J., <span class="emphasis"><em>RFC 821: Simple Mail
      Transfer Protocol</em></span>, 1982, <a href="http://www.ietf.org/rfc/rfc0821.txt" target="_top">http://www.ietf.org/rfc/rfc0821.txt</a>.
    </p><p>
      <a name="ref-RFC959"></a>[RFC959] Postel, J. and Reynolds, J., <span class="emphasis"><em>RFC
      959: File Transfer Protocol (FTP)</em></span>, 1985, <a href="http://www.ietf.org/rfc/rfc0959.txt" target="_top">http://www.ietf.org/rfc/rfc0959.txt</a>.
    </p><p>
      <a name="ref-RFC2616"></a>[RFC2616] Fielding, R. et al, <span class="emphasis"><em>RFC 2616:
      Hypertext Transfer Protocol -- HTTP/1.1</em></span>, 1999, <a href="http://www.ietf.org/rfc/rfc2616.txt" target="_top">http://www.ietf.org/rfc/rfc2616.txt</a>.
    </p><p>
      <a name="ref-RFC2732"></a>[RFC2732] Hinden, R., Carpenter, B. and Masinter,
      L., <span class="emphasis"><em>RFC 2732: Format for Literal IPv6 Addresses in URL's</em></span>,
      1999, <a href="http://www.ietf.org/rfc/rfc2732.txt" target="_top">http://www.ietf.org/rfc/rfc2732.txt</a>.
    </p><p>
      <a name="ref-RFC3513"></a>[RFC3513] Hinden, R. and Deering, S., <span class="emphasis"><em>RFC
      3513: Internet Protocol Version 6 (IPv6) Addressing Architecture</em></span>,
      2003, <a href="http://www.ietf.org/rfc/rfc3513.txt" target="_top">http://www.ietf.org/rfc/rfc3513.txt</a>.
    </p></div></div></body></html>
