<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; }
div.section { position: relative; }
span.xrefid { position: absolute; right: 0em; top: 0em; }
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 5)</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:  N4478 
Date:     2015-04-13
Revises:  N4370
Reply-To: Christopher Kohlhoff &lt;chris@kohlhoff.com&gt;
</pre>
<div class="chapter" title="Networking Library Proposal (Revision 5)"><div class="titlepage"><div><div><h2 class="title"><a name="network"></a>Networking Library Proposal (Revision 5)</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;Changes in this revision"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.changes_in_this_revision"></a>2.&#160;Changes in this revision</h2></div></div></div><p>
      This revision contains numerous changes resulting from the LWG wording review
      held in Cologne in February 2015. Please note, however, it does not yet contain
      all of the wording corrections and suggestions from that meeting, nor have
      the applied corrections and changes been reviewed. As the changes are too extensive
      to list here, readers may wish to view the GitHub page for this proposal at
      <span class="emphasis"><em><a href="https://github.com/chriskohlhoff/asio-tr2/" target="_top">https://github.com/chriskohlhoff/asio-tr2/</a></em></span>
      for further information.
    </p><p>
      The purpose of this revision is to provide LEWG with up-to-date wording in
      order to confirm and/or consider certain design choices, based on feedback
      from Cologne. To facilitate this process, this revision contains some of the
      suggested design changes from the wording review. There are two significant
      design changes worth noting here.
    </p><p>
      First, the <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span></code>
      class's <code class="computeroutput"><span class="identifier">accept</span></code> and <code class="computeroutput"><span class="identifier">async_accept</span></code> member functions have been changed
      to produce the incoming socket object by moving the result, rather than by
      taking a socket object by non-const reference. For example, a synchronous accept
      operation may now look like this:
    </p><pre class="programlisting"><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">my_acceptor</span><span class="special">.</span><span class="identifier">accept</span><span class="special">());</span>
<span class="comment">// read and write on newly accepted socket ...</span>
</pre><p>
      and an asynchronous accept operation like this:
    </p><pre class="programlisting"><span class="identifier">my_acceptor</span><span class="special">.</span><span class="identifier">async_accept</span><span class="special">(</span>
    <span class="special">[](</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket</span><span class="special">)</span>
    <span class="special">{</span>
      <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
      <span class="special">{</span>
        <span class="comment">// read and write on newly accepted socket</span>
      <span class="special">}</span>
    <span class="special">});</span>
</pre><p>
      As a consequence of this change, the <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span></code>
      class no longer inherits from <code class="computeroutput"><span class="identifier">basic_socket</span></code>
      &#8212; it did so previously to allow users to pass it to <code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">async_accept</span><span class="special">()</span></code>. Instead, <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span></code>
      and <code class="computeroutput"><span class="identifier">basic_socket_iostream</span></code> are
      move-enabled and support the ability to move-construct from a socket:
    </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="identifier">my_acceptor</span><span class="special">.</span><span class="identifier">accept</span><span class="special">());</span>
</pre><p>
      Second, there was concern about the use of resource-owning iterators associated
      with the <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">basic_resolver</span></code> template, and the related
      single iterator overloads of the free functions <code class="computeroutput"><span class="identifier">connect</span></code>
      and <code class="computeroutput"><span class="identifier">async_connect</span></code>. The resolver
      has been changed so that its <code class="computeroutput"><span class="identifier">resolve</span></code>
      operations now return a results class based on the regular expression library's
      <code class="computeroutput"><span class="identifier">match_results</span></code> template. This
      <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">basic_resolver_results</span></code> type satisfies the
      requirements of a sequence container, except that only the operations defined
      for const-qualified sequence containers are supported:
    </p><pre class="programlisting"><span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&amp;</span> <span class="identifier">result</span> <span class="special">:</span> <span class="identifier">my_resolver</span><span class="special">.</span><span class="identifier">resolve</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>
<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">result</span><span class="special">-&gt;</span><span class="identifier">endpoint</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="string">", "</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">result</span><span class="special">-&gt;</span><span class="identifier">host_name</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="string">", "</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">result</span><span class="special">-&gt;</span><span class="identifier">service_name</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
</pre><p>
      In addition, the single iterator overloads of the free functions <code class="computeroutput"><span class="identifier">connect</span></code> and <code class="computeroutput"><span class="identifier">async_connect</span></code>
      have been removed and replaced with overloads that accept an <code class="computeroutput"><span class="identifier">EndpointSequence</span></code>. This ensures that the following
      simple usage idiom is still supported:
    </p><pre class="programlisting"><span class="identifier">connect</span><span class="special">(</span><span class="identifier">my_socket</span><span class="special">,</span> <span class="identifier">my_resolver</span><span class="special">.</span><span class="identifier">resolve</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></div><div class="section" title="3.&#160;Reference implementation"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.reference_implementation"></a>3.&#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="4.&#160;Library examples"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.library_examples"></a>4.&#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 library.
    </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="5.&#160;Scope"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.scope"></a>5.&#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><li class="listitem">
          Other forms of asynchronous I/O, such as files. (However, the asynchronous
          model defined below is capable of supporting these facilities.)
        </li></ul></div></div><div class="section" title="6.&#160;Target audience"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.target_audience"></a>6.&#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="7.&#160;Related work"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.related_work"></a>7.&#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="8.&#160;Impact on the standard"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.impact_on_the_standard"></a>8.&#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="9.&#160;Relationship to other proposals"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.relationship_to_other_proposals"></a>9.&#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">N4242</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="10.&#160;Proposed text"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.proposed_text"></a>10.&#160;Proposed text</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="#scope.scope">10.1. Scope</a></span></dt><dt><span class="section"><a href="#conformance.conformance">10.2. Conformance</a></span></dt><dd><dl><dt><span class="section"><a href="#conformance.posix_conformance">10.2.1. POSIX conformance</a></span></dt><dt><span class="section"><a href="#conformance.conditionally_supported_features">10.2.2. Conditionally-supported features</a></span></dt></dl></dd><dt><span class="section"><a href="#references.normative_references">10.3. Normative references</a></span></dt><dt><span class="section"><a href="#namespaces.namespaces_and_headers">10.4. Namespaces and headers</a></span></dt><dt><span class="section"><a href="#definitions.definitions">10.5. Definitions</a></span></dt><dd><dl><dt><span class="section"><a href="#definitions.host_byte_order">10.5.1. host byte order</a></span></dt><dt><span class="section"><a href="#definitions.network_byte_order">10.5.2. network byte order</a></span></dt><dt><span class="section"><a href="#definitions.synchronous_operation">10.5.3. synchronous operation</a></span></dt><dt><span class="section"><a href="#definitions.asynchronous_operation">10.5.4. asynchronous operation</a></span></dt></dl></dd><dt><span class="section"><a href="#plans.future_plans__informative_">10.6. Future plans (Informative)</a></span></dt><dt><span class="section"><a href="#feature_test.feature_test_macros__informative_">10.7. Feature test macros (Informative)</a></span></dt><dt><span class="section"><a href="#description.method_of_description__informative_">10.8. Method of description (Informative)</a></span></dt><dd><dl><dt><span class="section"><a href="#description.structure_of_each_clause">10.8.1. Structure of each clause</a></span></dt><dd><dl><dt><span class="section"><a href="#description.detailed_specifications">10.8.1.1. Detailed specifications</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#error_reporting.error_reporting">10.9. Error reporting</a></span></dt><dd><dl><dt><span class="section"><a href="#error_reporting.synchronous_operations">10.9.1. Synchronous operations</a></span></dt><dt><span class="section"><a href="#error_reporting.asynchronous_operations">10.9.2. Asynchronous operations</a></span></dt><dt><span class="section"><a href="#error_reporting.error_conditions">10.9.3. Error conditions</a></span></dt></dl></dd><dt><span class="section"><a href="#network.library_summary">10.10. Library summary</a></span></dt><dt><span class="section"><a href="#network.convenience">10.11. Convenience header</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_networking___synopsis">10.11.1. Header <code class="literal">&lt;experimental/networking&gt;</code> synopsis</a></span></dt></dl></dd><dt><span class="section"><a href="#network.forward">10.12. Forward declarations</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_netfwd___synopsis">10.12.1. Header <code class="literal">&lt;experimental/netfwd&gt;</code> synopsis</a></span></dt></dl></dd><dt><span class="section"><a href="#network.async">10.13. Asynchronous model</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_executor___synopsis">10.13.1. Header <code class="literal">&lt;experimental/executor&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.async_requirements">10.13.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.proto_allocator">10.13.2.1. Proto-allocator requirements</a></span></dt><dt><span class="section"><a href="#requirements.asynchronous_operations">10.13.2.2. Requirements on asynchronous operations</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.completion_token">10.13.2.2.1. Completion tokens and handlers</a></span></dt><dt><span class="section"><a href="#requirements.automatic_deduction_of_initiating_function_return_type">10.13.2.2.2. Automatic deduction of initiating function return type</a></span></dt><dt><span class="section"><a href="#requirements.production_of_initiating_function_return_value">10.13.2.2.3. Production of initiating function return value</a></span></dt><dt><span class="section"><a href="#requirements.lifetime_of_initiating_function_arguments">10.13.2.2.4. Lifetime of initiating function arguments</a></span></dt><dt><span class="section"><a href="#requirements.associated_executor">10.13.2.2.5. Associated executor</a></span></dt><dt><span class="section"><a href="#requirements.i_o_executor">10.13.2.2.6. I/O executor</a></span></dt><dt><span class="section"><a href="#requirements.completion_handler_executor">10.13.2.2.7. Completion handler executor</a></span></dt><dt><span class="section"><a href="#requirements.outstanding_work">10.13.2.2.8. Outstanding work</a></span></dt><dt><span class="section"><a href="#requirements.allocation_of_intermediate_storage">10.13.2.2.9. Allocation of intermediate storage</a></span></dt><dt><span class="section"><a href="#requirements.execution_of_completion_handler_on_completion_of_asynchronous_operation">10.13.2.2.10. Execution of completion handler on completion of asynchronous
            operation</a></span></dt><dt><span class="section"><a href="#requirements.completion_handlers_and_exceptions">10.13.2.2.11. Completion handlers and exceptions</a></span></dt></dl></dd><dt><span class="section"><a href="#requirements.executor">10.13.2.3. Executor requirements</a></span></dt><dt><span class="section"><a href="#requirements.execution_context">10.13.2.4. Execution context requirements</a></span></dt><dt><span class="section"><a href="#requirements.service">10.13.2.5. Service requirements</a></span></dt><dt><span class="section"><a href="#requirements.signature">10.13.2.6. Signature requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.completion_handler_type">10.13.3. Class template <code class="literal">completion_handler_type</code></a></span></dt><dt><span class="section"><a href="#classes.async_result">10.13.4. Class template <code class="literal">async_result</code></a></span></dt><dt><span class="section"><a href="#classes.async_completion">10.13.5. Class template <code class="literal">async_completion</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__async_completion__members">10.13.5.1. <code class="literal">async_completion</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.associated_allocator">10.13.6. Class template <code class="literal">associated_allocator</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__associated_allocator__members">10.13.6.1. <code class="literal">associated_allocator</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.get_associated_allocator">10.13.7. Function <code class="literal">get_associated_allocator</code></a></span></dt><dt><span class="section"><a href="#classes.execution_context">10.13.8. Class <code class="literal">execution_context</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__execution_context__constructor">10.13.8.1. <code class="literal">execution_context</code> constructor</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__destructor">10.13.8.2. <code class="literal">execution_context</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__operations">10.13.8.3. <code class="literal">execution_context</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__protected_operations">10.13.8.4. <code class="literal">execution_context</code> protected operations</a></span></dt><dt><span class="section"><a href="#classes.__execution_context__globals">10.13.8.5. <code class="literal">execution_context</code> globals</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.execution_context__service">10.13.9. Class <code class="literal">execution_context::service</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__execution_context__service__members">10.13.9.1. <code class="literal">execution_context::service</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.is_executor">10.13.10. Class template <code class="literal">is_executor</code></a></span></dt><dt><span class="section"><a href="#classes.executor_arg_t">10.13.11. Executor argument tag</a></span></dt><dt><span class="section"><a href="#classes.uses_executor">10.13.12. <code class="literal">uses_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__uses_executor__trait">10.13.12.1. <code class="literal">uses_executor</code> trait</a></span></dt><dt><span class="section"><a href="#classes.uses_executor_construction">10.13.12.2. uses-executor construction</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.associated_executor">10.13.13. Class template <code class="literal">associated_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__associated_executor__members">10.13.13.1. <code class="literal">associated_executor</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.get_associated_executor">10.13.14. Function <code class="literal">get_associated_executor</code></a></span></dt><dt><span class="section"><a href="#classes.executor_wrapper">10.13.15. Class template <code class="literal">executor_wrapper</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor_wrapper__constructors">10.13.15.1. <code class="literal">executor_wrapper</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__executor_wrapper__access">10.13.15.2. <code class="literal">executor_wrapper</code> access</a></span></dt><dt><span class="section"><a href="#classes.__executor_wrapper__invocation">10.13.15.3. <code class="literal">executor_wrapper</code> invocation</a></span></dt><dt><span class="section"><a href="#classes.class_template_partial_specialization___async_result_">10.13.15.4. Class template partial specialization <code class="literal">async_result</code></a></span></dt><dt><span class="section"><a href="#classes.class_template_partial_specialization___associated_allocator_">10.13.15.5. Class template partial specialization <code class="literal">associated_allocator</code></a></span></dt><dt><span class="section"><a href="#classes.class_template_partial_specialization___associated_executor_">10.13.15.6. Class template partial specialization <code class="literal">associated_executor</code></a></span></dt></dl></dd><dt><span class="section"><a href="#functions.wrap">10.13.16. Function <code class="literal">wrap</code></a></span></dt><dt><span class="section"><a href="#classes.executor_work">10.13.17. Class template <code class="literal">executor_work</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor_work__members">10.13.17.1. <code class="literal">executor_work</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.make_work">10.13.18. Function <code class="literal">make_work</code></a></span></dt><dt><span class="section"><a href="#classes.system_executor">10.13.19. Class <code class="literal">system_executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__system_executor__operations">10.13.19.1. <code class="literal">system_executor</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__system_executor__comparisons">10.13.19.2. <code class="literal">system_executor</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.bad_executor">10.13.20. Class <code class="literal">bad_executor</code></a></span></dt><dt><span class="section"><a href="#classes.executor">10.13.21. Class <code class="literal">executor</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__executor__constructors">10.13.21.1. <code class="literal">executor</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__executor__assignment">10.13.21.2. <code class="literal">executor</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__executor__destructor">10.13.21.3. <code class="literal">executor</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__executor__modifiers">10.13.21.4. <code class="literal">executor</code> modifiers</a></span></dt><dt><span class="section"><a href="#classes.__executor__operations">10.13.21.5. <code class="literal">executor</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__executor__capacity">10.13.21.6. <code class="literal">executor</code> capacity</a></span></dt><dt><span class="section"><a href="#classes.__executor__target_access">10.13.21.7. <code class="literal">executor</code> target access</a></span></dt><dt><span class="section"><a href="#classes.__executor__comparisons">10.13.21.8. <code class="literal">executor</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.__executor__specialized_algorithms">10.13.21.9. <code class="literal">executor</code> specialized algorithms</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.dispatch">10.13.22. Function <code class="literal">dispatch</code></a></span></dt><dt><span class="section"><a href="#functions.post">10.13.23. Function <code class="literal">post</code></a></span></dt><dt><span class="section"><a href="#functions.defer">10.13.24. Function <code class="literal">defer</code></a></span></dt><dt><span class="section"><a href="#classes.strand">10.13.25. Class template <code class="literal">strand</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__strand__constructors">10.13.25.1. <code class="literal">strand</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__strand__assignment">10.13.25.2. <code class="literal">strand</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__strand__destructor">10.13.25.3. <code class="literal">strand</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__strand__operations">10.13.25.4. <code class="literal">strand</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__strand__comparisons">10.13.25.5. <code class="literal">strand</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.use_future_t">10.13.26. 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">10.13.26.1. <code class="literal">use_future_t</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__use_future_t__members">10.13.26.2. <code class="literal">use_future_t</code> members</a></span></dt><dt><span class="section"><a href="#classes.use_future_t_traits">10.13.26.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">10.13.27. Partial 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">10.13.28. Class template <code class="literal">packaged_handler</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__packaged_handler__members">10.13.28.1. <code class="literal">packaged_handler</code> members</a></span></dt><dt><span class="section"><a href="#classes.async_result_packaged_handler">10.13.28.2. Partial class template specialization <code class="literal">async_result</code></a></span></dt></dl></dd><dt><span class="section"><a href="#classes.packaged_token">10.13.29. Class template <code class="literal">packaged_token</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__packaged_token__members">10.13.29.1. <code class="literal">packaged_token</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.package">10.13.30. Function <code class="literal">package</code></a></span></dt></dl></dd><dt><span class="section"><a href="#network.basic_io_services">10.14. Basic I/O services</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_io_service___synopsis">10.14.1. Header <code class="literal">&lt;experimental/io_service&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#classes.io_service">10.14.2. Class <code class="literal">io_service</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__io_service__members">10.14.2.1. <code class="literal">io_service</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.io_service__executor_type">10.14.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">10.14.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">10.14.3.2. <code class="literal">io_service::executor_type</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__io_service__executor_type__operations">10.14.3.3. <code class="literal">io_service::executor_type</code> operations</a></span></dt><dt><span class="section"><a href="#classes.__io_service__executor_type__comparisons">10.14.3.4. <code class="literal">io_service::executor_type</code> comparisons</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#network.timers">10.15. Timers</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_timer___synopsis">10.15.1. Header <code class="literal">&lt;experimental/timer&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.timers_requirements">10.15.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.wait_traits">10.15.2.1. Wait traits requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.wait_traits">10.15.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">10.15.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">10.15.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">10.15.4.1. <code class="literal">basic_waitable_timer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__destructor">10.15.4.2. <code class="literal">basic_waitable_timer</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__assignment">10.15.4.3. <code class="literal">basic_waitable_timer</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_waitable_timer__operations">10.15.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">10.16. Buffers</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_buffer___synopsis">10.16.1. Header <code class="literal">&lt;experimental/buffer&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.buffers_requirements">10.16.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.mutable_buffers">10.16.2.1. Mutable buffer sequence requirements</a></span></dt><dt><span class="section"><a href="#requirements.const_buffers">10.16.2.2. Constant buffer sequence requirements</a></span></dt><dt><span class="section"><a href="#requirements.dynamic_buffers">10.16.2.3. Dynamic buffer requirements</a></span></dt><dt><span class="section"><a href="#requirements.synchronous_read_operations">10.16.2.4. Requirements on synchronous read operations</a></span></dt><dt><span class="section"><a href="#requirements.asynchronous_read_operations">10.16.2.5. Requirements on asynchronous read operations</a></span></dt><dt><span class="section"><a href="#requirements.synchronous_write_operations">10.16.2.6. Requirements on synchronous write operations</a></span></dt><dt><span class="section"><a href="#requirements.asynchronous_write_operations">10.16.2.7. Requirements on asynchronous write operations</a></span></dt><dt><span class="section"><a href="#requirements.sync_read_stream">10.16.2.8. Buffer-oriented synchronous read stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.async_read_stream">10.16.2.9. Buffer-oriented asynchronous read stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.sync_write_stream">10.16.2.10. Buffer-oriented synchronous write stream requirements</a></span></dt><dt><span class="section"><a href="#requirements.async_write_stream">10.16.2.11. Buffer-oriented asynchronous write stream requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.mutable_buffer">10.16.3. Class <code class="literal">mutable_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__mutable_buffer__constructors">10.16.3.1. <code class="literal">mutable_buffer</code> constructors</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.const_buffer">10.16.4. Class <code class="literal">const_buffer</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__const_buffer__constructors">10.16.4.1. <code class="literal">const_buffer</code> constructors</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.mutable_buffers_1">10.16.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">10.16.5.1. <code class="literal">mutable_buffers_1</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__mutable_buffers_1__members">10.16.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">10.16.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">10.16.6.1. <code class="literal">const_buffers_1</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__const_buffers_1__members">10.16.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">10.16.7. Buffer type traits</a></span></dt><dt><span class="section"><a href="#functions.buffer_cast">10.16.8. Function <code class="literal">buffer_cast</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_size">10.16.9. Function <code class="literal">buffer_size</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_copy">10.16.10. Function <code class="literal">buffer_copy</code></a></span></dt><dt><span class="section"><a href="#functions.buffer_arithmetic">10.16.11. Buffer arithmetic</a></span></dt><dt><span class="section"><a href="#functions.buffer">10.16.12. Buffer creation functions</a></span></dt><dt><span class="section"><a href="#classes.dynamic_vector_buffer">10.16.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">10.16.13.1. <code class="literal">dynamic_vector_buffer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__dynamic_vector_buffer__members">10.16.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">10.16.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">10.16.14.1. <code class="literal">dynamic_string_buffer</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__dynamic_string_buffer__members">10.16.14.2. <code class="literal">dynamic_string_buffer</code> members</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.dynamic_buffer">10.16.15. Dynamic buffer creation functions</a></span></dt><dt><span class="section"><a href="#classes.transfer_all">10.16.16. Class <code class="literal">transfer_all</code></a></span></dt><dt><span class="section"><a href="#classes.transfer_at_least">10.16.17. Class <code class="literal">transfer_at_least</code></a></span></dt><dt><span class="section"><a href="#classes.transfer_exactly">10.16.18. Class <code class="literal">transfer_exactly</code></a></span></dt><dt><span class="section"><a href="#functions.read">10.16.19. Synchronous read operations</a></span></dt><dt><span class="section"><a href="#functions.async_read">10.16.20. Asynchronous read operations</a></span></dt><dt><span class="section"><a href="#functions.write">10.16.21. Synchronous write operations</a></span></dt><dt><span class="section"><a href="#functions.async_write">10.16.22. Asynchronous write operations</a></span></dt><dt><span class="section"><a href="#functions.read_until">10.16.23. Synchronous delimited read operations</a></span></dt><dt><span class="section"><a href="#functions.async_read_until">10.16.24. Asynchronous delimited read operations</a></span></dt></dl></dd><dt><span class="section"><a href="#network.sockets">10.17. Sockets</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_socket___synopsis">10.17.1. Header <code class="literal">&lt;experimental/socket&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.sockets_requirements">10.17.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.native_handles">10.17.2.1. Native handles</a></span></dt><dt><span class="section"><a href="#requirements.endpoint">10.17.2.2. Endpoint requirements</a></span></dt><dt><span class="section"><a href="#requirements.protocol">10.17.2.3. Protocol requirements</a></span></dt><dt><span class="section"><a href="#requirements.acceptable_protocol">10.17.2.4. Acceptable protocol requirements</a></span></dt><dt><span class="section"><a href="#requirements.gettable_socket_option">10.17.2.5. Gettable socket option requirements</a></span></dt><dt><span class="section"><a href="#requirements.settable_socket_option">10.17.2.6. Settable socket option requirements</a></span></dt><dt><span class="section"><a href="#requirements.io_control_command">10.17.2.7. I/O control command requirements</a></span></dt><dt><span class="section"><a href="#requirements.connect_condition">10.17.2.8. Connect condition requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.socket_errc">10.17.3. Error codes</a></span></dt><dt><span class="section"><a href="#classes.socket_base">10.17.4. Class <code class="literal">socket_base</code></a></span></dt><dt><span class="section"><a href="#classes.socket_base__bool_socket_options">10.17.5. Boolean socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.boolean_socket_option_constructors">10.17.5.1. Boolean socket option constructors</a></span></dt><dt><span class="section"><a href="#classes.boolean_socket_option_members">10.17.5.2. Boolean socket option members</a></span></dt><dt><span class="section"><a href="#classes.boolean_socket_option_members__extensible_implementations_">10.17.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">10.17.6. Integral socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.integral_socket_option_constructors">10.17.6.1. Integral socket option constructors</a></span></dt><dt><span class="section"><a href="#classes.integral_socket_option_members">10.17.6.2. Integral socket option members</a></span></dt><dt><span class="section"><a href="#classes.integral_socket_option_members__extensible_implementations_">10.17.6.3. Integral socket option members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.socket_base__linger">10.17.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">10.17.7.1. <code class="literal">socket_base::linger</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__socket_base__linger__members">10.17.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_">10.17.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">10.17.8. Class template <code class="literal">basic_socket</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__basic_socket__constructors">10.17.8.1. <code class="literal">basic_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__destructor">10.17.8.2. <code class="literal">basic_socket</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__assignment">10.17.8.3. <code class="literal">basic_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket__operations">10.17.8.4. <code class="literal">basic_socket</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.basic_datagram_socket">10.17.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">10.17.9.1. <code class="literal">basic_datagram_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_datagram_socket__assignment">10.17.9.2. <code class="literal">basic_datagram_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_datagram_socket__operations">10.17.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">10.17.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">10.17.10.1. <code class="literal">basic_stream_socket</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_stream_socket__assignment">10.17.10.2. <code class="literal">basic_stream_socket</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_stream_socket__operations">10.17.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">10.17.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">10.17.11.1. <code class="literal">basic_socket_acceptor</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__destructor">10.17.11.2. <code class="literal">basic_socket_acceptor</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__assignment">10.17.11.3. <code class="literal">basic_socket_acceptor</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_acceptor__operations">10.17.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">10.18. Socket iostreams</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.basic_socket_streambuf">10.18.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">10.18.1.1. <code class="literal">basic_socket_streambuf</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_streambuf__members">10.18.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">10.18.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">10.18.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">10.18.2.1. <code class="literal">basic_socket_iostream</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__basic_socket_iostream__members">10.18.2.2. <code class="literal">basic_socket_iostream</code> members</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#network.socket_algorithms">10.19. Socket algorithms</a></span></dt><dd><dl><dt><span class="section"><a href="#functions.connect">10.19.1. Synchronous connect operations</a></span></dt><dt><span class="section"><a href="#functions.async_connect">10.19.2. Asynchronous connect operations</a></span></dt></dl></dd><dt><span class="section"><a href="#network.internet_protocol">10.20. Internet protocol</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_internet___synopsis">10.20.1. Header <code class="literal">&lt;experimental/internet&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#network.internet_protocol_requirements">10.20.2. Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="#requirements.internet_protocol">10.20.2.1. Internet protocol requirements</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__resolver_errc">10.20.3. Error codes</a></span></dt><dt><span class="section"><a href="#classes.ip__address">10.20.4. Class <code class="literal">ip::address</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address__constructors">10.20.4.1. <code class="literal">ip::address</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__assignment">10.20.4.2. <code class="literal">ip::address</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__members">10.20.4.3. <code class="literal">ip::address</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__address__comparisons">10.20.4.4. <code class="literal">ip::address</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address__creation">10.20.4.5. <code class="literal">ip::address</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address__io">10.20.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">10.20.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_">10.20.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">10.20.5.2. <code class="literal">ip::address_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__assignment">10.20.5.3. <code class="literal">ip::address_v4</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__members">10.20.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">10.20.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">10.20.5.6. <code class="literal">ip::address_v4</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__creation">10.20.5.7. <code class="literal">ip::address_v4</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__io">10.20.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">10.20.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_">10.20.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">10.20.6.2. <code class="literal">ip::address_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__assignment">10.20.6.3. <code class="literal">ip::address_v6</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__members">10.20.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">10.20.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">10.20.6.6. <code class="literal">ip::address_v6</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__creation">10.20.6.7. <code class="literal">ip::address_v6</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__io">10.20.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">10.20.7. Class <code class="literal">ip::bad_address_cast</code></a></span></dt><dt><span class="section"><a href="#functions.ip__address_cast">10.20.8. Function <code class="literal">ip::address_cast</code></a></span></dt><dt><span class="section"><a href="#classes.hash">10.20.9. Hash support</a></span></dt><dt><span class="section"><a href="#classes.ip__basic_address_iterator">10.20.10. Class template <code class="literal">ip::basic_address_iterator</code> specializations</a></span></dt><dt><span class="section"><a href="#classes.ip__basic_address_range">10.20.11. Class template <code class="literal">ip::basic_address_range</code> specializations</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4">10.20.12. 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">10.20.12.1. <code class="literal">ip::network_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__network_v4__members">10.20.12.2. <code class="literal">ip::network_v4</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__comparisons">10.20.12.3. <code class="literal">ip::network_v4</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__creation">10.20.12.4. <code class="literal">ip::network_v4</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v4__io">10.20.12.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">10.20.13. 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">10.20.13.1. <code class="literal">ip::network_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__network_v6__members">10.20.13.2. <code class="literal">ip::network_v6</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__comparisons">10.20.13.3. <code class="literal">ip::network_v6</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__creation">10.20.13.4. <code class="literal">ip::network_v6</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__network_v6__io">10.20.13.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">10.20.14. 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">10.20.14.1. <code class="literal">ip::basic_endpoint</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__members">10.20.14.2. <code class="literal">ip::basic_endpoint</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__comparisons">10.20.14.3. <code class="literal">ip::basic_endpoint</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_endpoint__i_o">10.20.14.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_">10.20.14.5. <code class="literal">ip::basic_endpoint</code> members (extensible implementations)</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__basic_resolver_entry">10.20.15. 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">10.20.15.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">10.20.15.2. <code class="literal">ip::basic_resolver_entry</code> members</a></span></dt><dt><span class="section"><a href="#classes.__op__basic_resolver_entry__comparisons">10.20.15.3. <code class="literal">op::basic_resolver_entry</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__basic_resolver_results">10.20.16. Class template <code class="literal">ip::basic_resolver_results</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__constructors">10.20.16.1. <code class="literal">ip::basic_resolver_results</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__assignment">10.20.16.2. <code class="literal">ip::basic_resolver_results</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__size">10.20.16.3. <code class="literal">ip::basic_resolver_results</code> size</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__element_access">10.20.16.4. <code class="literal">ip::basic_resolver_results</code> element access</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__swap">10.20.16.5. <code class="literal">ip::basic_resolver_results</code> swap</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver_results__comparisons">10.20.16.6. <code class="literal">ip::basic_resolver_results</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__resolver_base">10.20.17. Class <code class="literal">ip::resolver_base</code></a></span></dt><dt><span class="section"><a href="#classes.ip__basic_resolver">10.20.18. 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">10.20.18.1. <code class="literal">ip::basic_resolver</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__destructor">10.20.18.2. <code class="literal">ip::basic_resolver</code> destructor</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__assignment">10.20.18.3. <code class="literal">ip::basic_resolver</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__basic_resolver__operations">10.20.18.4. <code class="literal">ip::basic_resolver</code> operations</a></span></dt></dl></dd><dt><span class="section"><a href="#functions.ip__host_name">10.20.19. Host name functions</a></span></dt><dt><span class="section"><a href="#classes.ip__tcp">10.20.20. Class <code class="literal">ip::tcp</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__tcp__comparisons">10.20.20.1. <code class="literal">ip::tcp</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__tcp__no_delay">10.20.21. Class <code class="literal">ip::tcp::no_delay</code></a></span></dt><dt><span class="section"><a href="#classes.ip__udp">10.20.22. Class <code class="literal">ip::udp</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__udp__comparisons">10.20.22.1. <code class="literal">ip::udp</code> comparisons</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__v6_only">10.20.23. Class <code class="literal">ip::v6_only</code></a></span></dt><dt><span class="section"><a href="#classes.ip__unicast__hops">10.20.24. Class <code class="literal">ip::unicast::hops</code></a></span></dt><dt><span class="section"><a href="#classes.ip__multicast__group_socket_options">10.20.25. Multicast group management socket options</a></span></dt><dd><dl><dt><span class="section"><a href="#classes.multicast_group_management_socket_option_constructors">10.20.25.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_">10.20.25.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">10.20.26. 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">10.20.26.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_">10.20.26.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">10.20.27. Class <code class="literal">ip::multicast::hops</code></a></span></dt><dt><span class="section"><a href="#classes.ip__multicast__enable_loopback">10.20.28. Class <code class="literal">ip::multicast::enable_loopback</code></a></span></dt></dl></dd><dt><span class="section"><a href="#network.index">10.21. Index</a></span></dt></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><div class="section" title="10.1.&#160;Scope"><div class="titlepage"><div><div><h3 class="title"><a name="scope.scope"></a>10.1.&#160;Scope</h3></div></div></div><p>
        <span class="xrefid">
<a name="scope"></a>
<a class="link" href="#scope">[scope]</a>
<a class="indexterm" name="idm168541139120"></a>
</span>
      </p><p>
        This Technical Specification describes extensions to the C++ Standard Library.
        This Technical Specification specifies requirements for implementations of
        an interface that computer programs written in the C++ programming language
        may use to perform operations related to networking, such as operations involving
        sockets, timers, buffer management, host name resolution and internet protocols.
        This Technical Specification is applicable to information technology systems
        that can perform network operations, such as those with operating systems
        that conform to the POSIX interface. This Technical Specification is applicable
        only to vendors who wish to provide the interface it describes.
      </p></div><div class="section" title="10.2.&#160;Conformance"><div class="titlepage"><div><div><h3 class="title"><a name="conformance.conformance"></a>10.2.&#160;Conformance</h3></div></div></div><p>
        <span class="xrefid">
<a name="conformance"></a>
<a class="link" href="#conformance">[conformance]</a>
<a class="indexterm" name="idm168541134160"></a>
</span>
      </p><p>
        Conformance is specified in terms of behavior. Ideal behavior is not always
        implementable, so the conformance sub-clauses take that into account.
      </p><div class="section" title="10.2.1.&#160;POSIX conformance"><div class="titlepage"><div><div><h4 class="title"><a name="conformance.posix_conformance"></a>10.2.1.&#160;POSIX conformance</h4></div></div></div><p>
          <span class="xrefid">
<a name="conformance.9945"></a>
<a class="link" href="#conformance.9945">[conformance.9945]</a>
<a class="indexterm" name="idm168541129920"></a>
</span>
        </p><p>
          Some behavior is specified by reference to POSIX. How such behavior is
          actually implemented is unspecified.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> This constitutes an "as if" rule
          allowing implementations to call native operating system or other APIs.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><p>
          Implementations are encouraged to provide such behavior as it is defined
          by POSIX. Implementations shall document any behavior that differs from
          the behavior defined by POSIX. Implementations that do not support exact
          POSIX behavior are encouraged to provide behavior as close to POSIX behavior
          as is reasonable given the limitations of actual operating systems and
          file systems. If an implementation cannot provide any reasonable behavior,
          the implementation shall report an error as specified in <a class="link" href="#error_reporting.error_reporting" title="10.9.&#160;Error reporting">Error
          Reporting</a>.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> This allows users to rely on an exception being
          thrown or an error code being set when an implementation cannot provide
          any reasonable behavior. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><p>
          Implementations are not required to provide behavior that is not supported
          by a particular operating system.
        </p></div><div class="section" title="10.2.2.&#160;Conditionally-supported features"><div class="titlepage"><div><div><h4 class="title"><a name="conformance.conditionally_supported_features"></a>10.2.2.&#160;Conditionally-supported features</h4></div></div></div><p>
          <span class="xrefid">
<a name="conformance.conditional"></a>
<a class="link" href="#conformance.conditional">[conformance.conditional]</a>
<a class="indexterm" name="idm168541120512"></a>
</span>
        </p><p>
          This Technical Specification defines conditially-supported features, in
          the form of additional member functions on types that satisfy <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements"><code class="computeroutput"><span class="identifier">Protocol</span></code></a>, <a class="link" href="#requirements.endpoint" title="10.17.2.2.&#160;Endpoint requirements"><code class="computeroutput"><span class="identifier">Endpoint</span></code></a>, <a class="link" href="#requirements.settable_socket_option" title="10.17.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="10.17.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="10.17.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> This is so that, 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>
          For the purposes of this Technical Specification, implementations that
          provide all of the additional member functions are known as <span class="emphasis"><em>extensible
          implementations</em></span>.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> Implementations are encouraged to provide the
          additional member functions, where possible. It is intended that POSIX
          and Windows implementations will provide them. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p></div></div><div class="section" title="10.3.&#160;Normative references"><div class="titlepage"><div><div><h3 class="title"><a name="references.normative_references"></a>10.3.&#160;Normative references</h3></div></div></div><p>
        <span class="xrefid">
<a name="references"></a>
<a class="link" href="#references">[references]</a>
<a class="indexterm" name="idm168541105536"></a>
</span>
      </p><p>
        The following referenced documents are indispensable for the application
        of this document. For dated references, only the edition cited applies. For
        undated references, the latest edition of the referenced document (including
        any amendments) applies.
      </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
            ISO/IEC 14882, Programming Language C++
          </li><li class="listitem">
            ISO/IEC 9945, Information Technology &#8212; Portable Operating System Interface
            (POSIX)
          </li><li class="listitem">
            C++ Extensions for Library Fundamentals
          </li></ul></div><p>
        [<span class="emphasis"><em>Note:</em></span> The programming language and library described
        in ISO/IEC 14882 is herein called the C++ Standard. References to clauses
        within the C++ Standard are written as "C++Std [xref]". <br>
        The operating system interface described in ISO/IEC 9945 is herein called
        POSIX. &#8212;<span class="emphasis"><em>end note</em></span>]
      </p><p>
        This Technical Specification mentions commercially available operating systems
        for purposes of exposition. <sup>[<a name="references.proposed_text.normative_references.f0" href="#ftn.references.proposed_text.normative_references.f0" class="footnote">1</a>]</sup>
      </p><p>
        Unless otherwise specified, the whole of the C++ Standard's Library introduction
        (C++Std [library]) is included into this Technical Specification by reference.
      </p></div><div class="section" title="10.4.&#160;Namespaces and headers"><div class="titlepage"><div><div><h3 class="title"><a name="namespaces.namespaces_and_headers"></a>10.4.&#160;Namespaces and headers</h3></div></div></div><p>
        <span class="xrefid">
<a name="namespaces"></a>
<a class="link" href="#namespaces">[namespaces]</a>
<a class="indexterm" name="idm168543159792"></a>
</span>
      </p><p>
        The components described in this Technical Specification are experimental
        and not part of the C++ standard library. All components described in this
        Technical Specification are declared in namespace <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1</code> or a sub-namespace thereof unless
        otherwise specified. The header described in this technical specification
        shall import the contents of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span>network_v1</code> into <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span></code>
        as if by:
      </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>
    <span class="keyword">inline</span> <span class="keyword">namespace</span> network_v1 <span class="special">{}</span>
  <span class="special">}</span>
<span class="special">}</span>
</pre><p>
        Unless otherwise specified, references to other entities described in this
        Technical Specification are assumed to be qualified with <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></code>,
        references to entities described in the C++ standard are assumed to be qualified
        with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span></code>,
        and references to entities described in C++ Extensions for Library Fundamentals
        are assumed to be qualified with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">fundamentals_v1</span><span class="special">::</span></code>.
      </p></div><div class="section" title="10.5.&#160;Definitions"><div class="titlepage"><div><div><h3 class="title"><a name="definitions.definitions"></a>10.5.&#160;Definitions</h3></div></div></div><p>
        <span class="xrefid">
<a name="defs"></a>
<a class="link" href="#defs">[defs]</a>
<a class="indexterm" name="idm168543132928"></a>
</span>
      </p><div class="section" title="10.5.1.&#160;host byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.host_byte_order"></a>10.5.1.&#160;host byte order</h4></div></div></div><p>
          <span class="xrefid">
<a name="defs.host.byte.order"></a>
<a class="link" href="#defs.host.byte.order">[defs.host.byte.order]</a>
<a class="indexterm" name="idm168543129248"></a>
</span>
See
          section 3.194 of POSIX Base Definitions, <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_194" target="_top">Host
          Byte Order</a>.
        </p></div><div class="section" title="10.5.2.&#160;network byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.network_byte_order"></a>10.5.2.&#160;network byte order</h4></div></div></div><p>
          <span class="xrefid">
<a name="defs.net.byte.order"></a>
<a class="link" href="#defs.net.byte.order">[defs.net.byte.order]</a>
<a class="indexterm" name="idm168543124736"></a>
</span>
See
          section 3.238 of POSIX Base Definitions, <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_238" target="_top">Network
          Byte Order</a>.
        </p></div><div class="section" title="10.5.3.&#160;synchronous operation"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.synchronous_operation"></a>10.5.3.&#160;synchronous operation</h4></div></div></div><p>
          <span class="xrefid">
<a name="defs.sync.op"></a>
<a class="link" href="#defs.sync.op">[defs.sync.op]</a>
<a class="indexterm" name="idm168543120224"></a>
</span>
A synchronous operation
          is one where control is not returned until the operation completes.
        </p></div><div class="section" title="10.5.4.&#160;asynchronous operation"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.asynchronous_operation"></a>10.5.4.&#160;asynchronous operation</h4></div></div></div><p>
          <span class="xrefid">
<a name="defs.async.op"></a>
<a class="link" href="#defs.async.op">[defs.async.op]</a>
<a class="indexterm" name="idm168543116304"></a>
</span>
An asynchronous operation
          is one where control is returned immediately without waiting for the operation
          to complete. Multiple asynchronous operations may be executed concurrently.
        </p></div></div><div class="section" title="10.6.&#160;Future plans (Informative)"><div class="titlepage"><div><div><h3 class="title"><a name="plans.future_plans__informative_"></a>10.6.&#160;Future plans (Informative)</h3></div></div></div><p>
        <span class="xrefid">
<a name="plans"></a>
<a class="link" href="#plans">[plans]</a>
<a class="indexterm" name="idm168543112144"></a>
</span>
      </p><p>
        This section describes tentative plans for future versions of this technical
        specification and plans for moving content into future versions of the C++
        Standard.
      </p><p>
        The C++ committee may release new versions of this technical specification,
        containing networking library extensions we hope to add to a near-future
        version of the C++ Standard. Future versions will define their contents in
        <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">network_v2</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">network_v3</span></code>,
        etc., with the most recent implemented version inlined into <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span></code>.
      </p><p>
        When an extension defined in this or a future version of this technical specification
        represents enough existing practice, it will be moved into the next version
        of the C++ Standard by removing the <code class="computeroutput"><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">network_vN</span></code>
        segment of its namespace and by removing the <code class="computeroutput"><span class="identifier">experimental</span><span class="special">/</span></code> prefix from its header's path.
      </p></div><div class="section" title="10.7.&#160;Feature test macros (Informative)"><div class="titlepage"><div><div><h3 class="title"><a name="feature_test.feature_test_macros__informative_"></a>10.7.&#160;Feature test macros (Informative)</h3></div></div></div><p>
        <span class="xrefid">
<a name="feature.test"></a>
<a class="link" href="#feature.test">[feature.test]</a>
<a class="indexterm" name="idm168543095248"></a>
</span>
      </p><p>
        These macros allow users to determine which version of this Technical Specification
        is supported by the headers defined by the specification. All headers in
        this Technical Specification shall supply the following macro definition:
      </p><pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">__cpp_lib_experimental_network</span> <span class="identifier">yyyymm</span>
</pre><p>
        If an implementation supplies all of the conditionally-supported features
        specified in <a class="link" href="#conformance.conditional">[conformance.conditional]</a>, all headers
        in this Technical Specification shall supply the following macro definition:
      </p><pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">__cpp_lib_experimental_network_extensible</span> <span class="identifier">yyyymm</span>
</pre><p>
        [<span class="emphasis"><em>Note:</em></span> The value of the macros <code class="computeroutput"><span class="identifier">__cpp_lib_experimental_network</span></code>
        and <code class="computeroutput"><span class="identifier">__cpp_lib_experimental_network_extensible</span></code>
        is <code class="computeroutput"><span class="identifier">yyyymm</span></code> where <code class="computeroutput"><span class="identifier">yyyy</span></code> is the year and <code class="computeroutput"><span class="identifier">mm</span></code>
        the month when the version of the Technical Specification was completed.
        &#8212;<span class="emphasis"><em>end note</em></span>]
      </p></div><div class="section" title="10.8.&#160;Method of description (Informative)"><div class="titlepage"><div><div><h3 class="title"><a name="description.method_of_description__informative_"></a>10.8.&#160;Method of description (Informative)</h3></div></div></div><p>
        <span class="xrefid">
<a name="description"></a>
<a class="link" href="#description">[description]</a>
<a class="indexterm" name="idm168543078000"></a>
</span>
      </p><p>
        This subclause describes the conventions used to specify this Technical Specification,
        in addition to those conventions specified in C++ Std, [description].
      </p><div class="section" title="10.8.1.&#160;Structure of each clause"><div class="titlepage"><div><div><h4 class="title"><a name="description.structure_of_each_clause"></a>10.8.1.&#160;Structure of each clause</h4></div></div></div><p>
          <span class="xrefid">
<a name="structure"></a>
<a class="link" href="#structure">[structure]</a>
<a class="indexterm" name="idm168543073504"></a>
</span>
        </p><div class="section" title="10.8.1.1.&#160;Detailed specifications"><div class="titlepage"><div><div><h5 class="title"><a name="description.detailed_specifications"></a>10.8.1.1.&#160;Detailed specifications</h5></div></div></div><p>
            <span class="xrefid">
<a name="structure.specifications"></a>
<a class="link" href="#structure.specifications">[structure.specifications]</a>
<a class="indexterm" name="idm168543069488"></a>
</span>
          </p><p>
            In addition to the elements defined in C++Std [structure.specifications],
            descriptions of function semantics contain the following elements (as
            appropriate):
          </p><p>
            &#8212; <span class="emphasis"><em>Completion signature:</em></span> - if the function initiates
            an asynchronous operation, specifies the signature of a completion handler
            used to receive the result of the operation.
          </p></div></div></div><div class="section" title="10.9.&#160;Error reporting"><div class="titlepage"><div><div><h3 class="title"><a name="error_reporting.error_reporting"></a>10.9.&#160;Error reporting</h3></div></div></div><p>
        <span class="xrefid">
<a name="err.report"></a>
<a class="link" href="#err.report">[err.report]</a>
<a class="indexterm" name="idm168543063584"></a>
</span>
      </p><div class="section" title="10.9.1.&#160;Synchronous operations"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.synchronous_operations"></a>10.9.1.&#160;Synchronous operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="err.report.sync"></a>
<a class="link" href="#err.report.sync">[err.report.sync]</a>
<a class="indexterm" name="idm168543059664"></a>
</span>
        </p><p>
          Most synchronous network library functions 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> (C++ Std, [syserr]).
        </p><div class="sidebar"><p class="title"><b></b></p><p>
          Check whether it is "most" overloads, "some" or "all".
        </p></div><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.<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,
          the function exits via an exception of a type that would match a handler
          of type <code class="computeroutput"><span class="identifier">system_error</span></code>.
        </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 <code class="computeroutput"><span class="identifier">ec</span></code> is set as appropriate
          for the specific error. Otherwise, the <code class="computeroutput"><span class="identifier">ec</span></code>
          argument is set such that <code class="computeroutput"><span class="special">!</span><span class="identifier">ec</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>.
        </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
          are 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 are 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><p>
          except that the type thrown may differ as specified above.
        </p><p>
          For both overloads, failure to allocate storage is reported by throwing
          an exception as described in the C++ standard (C++14 [res.on.exception.handling]).
        </p></div><div class="section" title="10.9.2.&#160;Asynchronous operations"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.asynchronous_operations"></a>10.9.2.&#160;Asynchronous operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="err.report.async"></a>
<a class="link" href="#err.report.async">[err.report.async]</a>
<a class="indexterm" name="idm168542979136"></a>
</span>
        </p><p>
          Asynchronous network library functions in this Technical Specification
          are identified by having the prefix <code class="computeroutput"><span class="identifier">async_</span></code>
          and take a completion handler <a class="link" href="#async.reqmts.async.token">[async.reqmts.async.token]</a>.
          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 completion handler is 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 <code class="computeroutput"><span class="keyword">true</span></code>.
        </p><p>
          &#8212; Asynchronous operations shall not fail with an error condition that indicates
          interruption of an operating system or underlying API by a signal [<span class="emphasis"><em>Note:</em></span>
          Such as POSIX error number <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 POSIX error numbers <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>; Windows error numbers <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="10.9.3.&#160;Error conditions"><div class="titlepage"><div><div><h4 class="title"><a name="error_reporting.error_conditions"></a>10.9.3.&#160;Error conditions</h4></div></div></div><p>
          <span class="xrefid">
<a name="err.report.conditions"></a>
<a class="link" href="#err.report.conditions">[err.report.conditions]</a>
<a class="indexterm" name="idm168542955424"></a>
</span>
        </p><p>
          Unless otherwise specified, when the behavior of a synchronous or asynchronous
          operation is defined "as if" implemented by a POSIX 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 POSIX 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++Std [syserr]) or <a class="link" href="#classes.ip__resolver_errc" title="10.20.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 POSIX specification for <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/shutdown.html" target="_top">shutdown</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/9699919799/functions/shutdown.html" target="_top">shutdown</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="10.10.&#160;Library summary"><div class="titlepage"><div><div><h3 class="title"><a name="network.library_summary"></a>10.10.&#160;Library summary</h3></div></div></div><p>
        <span class="xrefid">
<a name="summary"></a>
<a class="link" href="#summary">[summary]</a>
<a class="indexterm" name="idm168542926464"></a>
</span>
      </p><div class="table"><a name="network.proposed_text.library_summary.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>
                  Clause
                </p>
              </th><th>
                <p>
                  Header(s)
                </p>
              </th></tr></thead><tbody><tr><td>
                <p>
                  <a class="link" href="#network.convenience" title="10.11.&#160;Convenience header">Convenience header</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">networking</span><span class="special">&gt;</span></code>
                </p>
              </td></tr><tr><td>
                <p>
                  <a class="link" href="#network.forward" title="10.12.&#160;Forward declarations">Forward declarations</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">netfwd</span><span class="special">&gt;</span></code>
                </p>
              </td></tr><tr><td>
                <p>
                  <a class="link" href="#network.async" title="10.13.&#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">executor</span><span class="special">&gt;</span></code>
                </p>
              </td></tr><tr><td>
                <p>
                  <a class="link" href="#network.basic_io_services" title="10.14.&#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="10.15.&#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="10.16.&#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="10.17.&#160;Sockets">Sockets</a><br> <a class="link" href="#network.socket_streams" title="10.18.&#160;Socket iostreams">Socket
                  iostreams</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="10.20.&#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 Technical Specification, 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.library_summary.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">AcceptableProtocol</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.acceptable_protocol" title="10.17.2.4.&#160;Acceptable protocol requirements">acceptable protocol</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">Allocator</span></code>
                </p>
              </td><td>
                <p>
                  C++Std, [allocator.requirements]
                </p>
              </td></tr><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="10.16.2.9.&#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="10.16.2.11.&#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">CompletionToken</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.completion_token" title="10.13.2.2.1.&#160;Completion tokens and handlers">completion token</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">ConnectCondition</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.connect_condition" title="10.17.2.8.&#160;Connect condition requirements">connect condition</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="10.16.2.2.&#160;Constant buffer sequence requirements">constant buffer sequence</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">DynamicBuffer</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.dynamic_buffers" title="10.16.2.3.&#160;Dynamic buffer requirements">dynamic buffer</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">ExecutionContext</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.execution_context" title="10.13.2.4.&#160;Execution context requirements">execution context</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">Executor</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">executor</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="10.17.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="10.20.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="10.17.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="10.16.2.1.&#160;Mutable buffer sequence requirements">mutable buffer sequence</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">ProtoAllocator</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.proto_allocator" title="10.13.2.1.&#160;Proto-allocator requirements">proto-allocator</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="10.17.2.3.&#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="10.13.2.5.&#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="10.17.2.6.&#160;Settable socket option requirements">settable socket
                  option</a>
                </p>
              </td></tr><tr><td>
                <p>
                  <code class="computeroutput"><span class="identifier">Signature</span></code>
                </p>
              </td><td>
                <p>
                  <a class="link" href="#requirements.signature" title="10.13.2.6.&#160;Signature requirements">signature</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="10.16.2.8.&#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="10.16.2.10.&#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="10.15.2.1.&#160;Wait traits requirements">wait traits</a>
                </p>
              </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.11.&#160;Convenience header"><div class="titlepage"><div><div><h3 class="title"><a name="network.convenience"></a>10.11.&#160;Convenience header</h3></div></div></div><p>
        <span class="xrefid">
<a name="convenience.hdr"></a>
<a class="link" href="#convenience.hdr">[convenience.hdr]</a>
<a class="indexterm" name="idm168542778096"></a>
</span>

      </p><div class="section" title="10.11.1.&#160;Header &lt;experimental/networking&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_networking___synopsis"></a>10.11.1.&#160;Header <code class="literal">&lt;experimental/networking&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="convenience.hdr.synop"></a>
<a class="link" href="#convenience.hdr.synop">[convenience.hdr.synop]</a>
<a class="indexterm" name="idm168542773024"></a>
</span>
        </p><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">executor</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <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>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">timer</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">buffer</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">socket</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">experimental</span><span class="special">/</span><span class="identifier">internet</span><span class="special">&gt;</span>
</pre><p>
          [<span class="emphasis"><em>Note:</em></span> This header is provided as a convenience for
          programs so that they may access all networking facilities via a single,
          self-contained <code class="computeroutput"><span class="preprocessor">#include</span></code>.
          &#8212;<span class="emphasis"><em>end note</em></span>]
        </p></div></div><div class="section" title="10.12.&#160;Forward declarations"><div class="titlepage"><div><div><h3 class="title"><a name="network.forward"></a>10.12.&#160;Forward declarations</h3></div></div></div><p>
        <span class="xrefid">
<a name="fwd.decl"></a>
<a class="link" href="#fwd.decl">[fwd.decl]</a>
<a class="indexterm" name="idm168542745520"></a>
</span>

      </p><div class="section" title="10.12.1.&#160;Header &lt;experimental/netfwd&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_netfwd___synopsis"></a>10.12.1.&#160;Header <code class="literal">&lt;experimental/netfwd&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="fwd.decl.synop"></a>
<a class="link" href="#fwd.decl.synop">[fwd.decl.synop]</a>
<a class="indexterm" name="idm168542740576"></a>
</span>
        </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">execution_context</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">executor_wrapper</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">class</span> <span class="identifier">executor_work</span><span class="special">;</span>
      <span class="keyword">class</span> <span class="identifier">system_executor</span><span class="special">;</span>
      <span class="keyword">class</span> <span class="identifier">executor</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">class</span> <span class="identifier">strand</span><span class="special">;</span>

      <span class="keyword">class</span> <span class="identifier">io_service</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">&gt;</span> <span class="keyword">struct</span> <span class="identifier">wait_traits</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">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">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>

      <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">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">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">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">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> <span class="identifier">basic_socket_streambuf</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">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> <span class="identifier">basic_socket_iostream</span><span class="special">;</span>

      <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">class</span> <span class="identifier">address_v4</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">address_v6</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">address_iterator_v4</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">address_iterator_v6</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">address_range_v4</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">address_range_v6</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">network_v4</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">network_v6</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">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">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_results</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">class</span> <span class="identifier">tcp</span><span class="special">;</span>
        <span class="keyword">class</span> <span class="identifier">udp</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>
          Default template arguments are described as appearing both in <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">netfwd</span><span class="special">&gt;</span></code> and in the synopsis of other headers
          but it is well-formed to include both <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">netfwd</span><span class="special">&gt;</span></code>
          and one or more of the other headers. [<span class="emphasis"><em>Note:</em></span> It is
          the implementation&#8217;s responsibility to implement headers so that including
          <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">netfwd</span><span class="special">&gt;</span></code> and other headers does not violate
          the rules about multiple occurrences of default arguments. &#8212;<span class="emphasis"><em>end
          note</em></span>]
        </p></div></div><div class="section" title="10.13.&#160;Asynchronous model"><div class="titlepage"><div><div><h3 class="title"><a name="network.async"></a>10.13.&#160;Asynchronous model</h3></div></div></div><p>
        <span class="xrefid">
<a name="async"></a>
<a class="link" href="#async">[async]</a>
<a class="indexterm" name="idm168542584880"></a>
</span>

      </p><div class="section" title="10.13.1.&#160;Header &lt;experimental/executor&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_executor___synopsis"></a>10.13.1.&#160;Header <code class="literal">&lt;experimental/executor&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="async.synop"></a>
<a class="link" href="#async.synop">[async.synop]</a>
<a class="indexterm" name="idm168542579920"></a>
</span>
        </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">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.completion_handler_type" title="10.13.3.&#160;Class template completion_handler_type">completion_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">completion_handler_type_t</span> <span class="special">=</span>
          <span class="keyword">typename</span> <span class="identifier">completion_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">CompletionHandler</span><span class="special">&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.async_result" title="10.13.4.&#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="10.13.5.&#160;Class template async_completion">async_completion</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">ProtoAllocator</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="10.13.6.&#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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">;</span>

      // <a class="link" href="#functions.get_associated_allocator" title="10.13.7.&#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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>

      <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="10.13.8.&#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="10.13.10.&#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="10.13.11.&#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="10.13.12.&#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="10.13.13.&#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="10.13.14.&#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">class</span> <a class="link" href="#classes.executor_wrapper" title="10.13.15.&#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">completion_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">ProtoAllocator</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">ProtoAllocator</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="10.13.16.&#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">Executor</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.executor_work" title="10.13.17.&#160;Class template executor_work">executor_work</a><span class="special">;</span>

      // <a class="link" href="#functions.make_work" title="10.13.18.&#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="10.13.19.&#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="10.13.20.&#160;Class bad_executor">bad_executor</a><span class="special">;</span>

      <span class="keyword">class</span> <a class="link" href="#classes.executor" title="10.13.21.&#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="10.13.22.&#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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.13.23.&#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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.13.24.&#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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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>

      <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="10.13.25.&#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>

      <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ProtoAllocator</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="10.13.26.&#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">ProtoAllocator</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">completion_handler_type</span><span class="special">&lt;</span><span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">ProtoAllocator</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="10.13.27.&#160;Partial 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="special">,</span> <span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">packaged_handler</span><span class="special">;</span> <span class="comment">// undefined</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">Arg</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</span><span class="special">&gt;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.packaged_handler" title="10.13.28.&#160;Class template packaged_handler">packaged_handler</a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...),</span> <span class="identifier">ProtoAllocator</span><span class="special">&gt;;</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.29.&#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">ProtoAllocator</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">completion_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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&gt;</span> <a class="link" href="#functions.package" title="10.13.30.&#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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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">Allocator</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">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="identifier">Allocator</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="10.13.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.async_requirements"></a>10.13.2.&#160;Requirements</h4></div></div></div><p>
          <span class="xrefid">
<a name="async.reqmts"></a>
<a class="link" href="#async.reqmts">[async.reqmts]</a>
<a class="indexterm" name="idm168537697840"></a>
</span>

        </p><div class="section" title="10.13.2.1.&#160;Proto-allocator requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.proto_allocator"></a>10.13.2.1.&#160;Proto-allocator requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.proto.allocator"></a>
<a class="link" href="#async.reqmts.proto.allocator">[async.reqmts.proto.allocator]</a>
<a class="indexterm" name="idm168537693536"></a>
</span>
          </p><p>
            A type <code class="computeroutput"><span class="identifier">A</span></code> meets the proto-allocator
            requirements if <code class="computeroutput"><span class="identifier">A</span></code> is
            <code class="computeroutput"><span class="identifier">CopyConstructible</span></code> (C++Std,
            [copyconstructible]), <code class="computeroutput"><span class="identifier">Destructible</span></code>
            (C++Std, [destructible]), and <code class="computeroutput"><span class="identifier">allocator_traits</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;::</span><span class="identifier">rebind_alloc</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span></code> meets the allocator requirements
            (C++Std, [allocator.requirements]), where <code class="computeroutput"><span class="identifier">U</span></code>
            is an object type. [<span class="emphasis"><em>Note:</em></span> For example, <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>
            meets the proto-allocator requirements but not the allocator requirements.
            &#8212;<span class="emphasis"><em>end note</em></span>] No constructor, comparison operator, copy
            operation, move operation, or swap operation on these types shall exit
            via an exception.
          </p></div><div class="section" title="10.13.2.2.&#160;Requirements on asynchronous operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_operations"></a>10.13.2.2.&#160;Requirements on asynchronous operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.async"></a>
<a class="link" href="#async.reqmts.async">[async.reqmts.async]</a>
<a class="indexterm" name="idm168541090736"></a>
</span>
          </p><p>
            In this Technical Specification, 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="10.13.2.2.1.&#160;Completion tokens and handlers"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.completion_token"></a>10.13.2.2.1.&#160;Completion tokens and handlers</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.token"></a>
<a class="link" href="#async.reqmts.async.token">[async.reqmts.async.token]</a>
<a class="indexterm" name="idm168541085184"></a>
</span>
            </p><p>
              All initiating functions in this Technical Specification:
            </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>
              (C++ Std [func.def]).
            </p><p>
              A <span class="emphasis"><em>completion 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">CompletionHandler</span></code>
              of its completion handler function object by performing <code class="computeroutput"><span class="identifier">completion_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 completion handler object <code class="computeroutput"><span class="identifier">completion_handler</span></code>
              is initialized with <code class="computeroutput"><span class="identifier">completion_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>. [<span class="emphasis"><em>Note:</em></span> No other
              requirements are placed on the type <code class="computeroutput"><span class="identifier">CompletionToken</span></code>.
              &#8212;<span class="emphasis"><em>end note</em></span>]
            </p><p>
              The type <code class="computeroutput"><span class="identifier">CompletionHandler</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 Technical Specification have named parameters, and
              the result of an asynchronous operation is specified in terms of these
              names.
            </p></div><div class="section" title="10.13.2.2.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>10.13.2.2.2.&#160;Automatic deduction of initiating function return type</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.return.type"></a>
<a class="link" href="#async.reqmts.async.return.type">[async.reqmts.async.return.type]</a>
<a class="indexterm" name="idm168542141904"></a>
</span>
            </p><p>
              For the sake of exposition, this specification sometimes annotates
              functions with a return type <code class="computeroutput"><span class="emphasis"><em>DEDUCED</em></span></code>. For every function declaration
              that returns <code class="computeroutput"><span class="emphasis"><em>DEDUCED</em></span></code>, the meaning is equivalent to specifying
              the return type as <code class="computeroutput"><span class="keyword">typename</span>
              <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">CompletionHandler</span><span class="special">&gt;::</span><span class="identifier">type</span></code>.
            </p></div><div class="section" title="10.13.2.2.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>10.13.2.2.3.&#160;Production of initiating function return value</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.return.value"></a>
<a class="link" href="#async.reqmts.async.return.value">[async.reqmts.async.return.value]</a>
<a class="indexterm" name="idm168542132704"></a>
</span>
            </p><p>
              An initiating function in this Technical Specification produces its
              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">CompletionHandler</span><span class="special">&gt;</span></code>, initialized 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 operand of the return statement.
            </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">completion_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="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">completion_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">completion_handler</span><span class="special">)&gt;</span> <span class="identifier">result</span><span class="special">(</span><span class="identifier">completion_handler</span><span class="special">);</span>

  <span class="comment">// initiate the operation and cause completion_handler to be invoked with</span>
  <span class="comment">// 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.completion_handler to be invoked</span>
  <span class="comment">// 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="10.13.2.2.4.&#160;Lifetime of initiating function arguments"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.lifetime_of_initiating_function_arguments"></a>10.13.2.2.4.&#160;Lifetime of initiating function arguments</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.lifetime"></a>
<a class="link" href="#async.reqmts.async.lifetime">[async.reqmts.async.lifetime]</a>
<a class="indexterm" name="idm168538641168"></a>
</span>
            </p><p>
              Unless otherwise specified, the lifetime of arguments to initiating
              functions shall be treated as follows:
            </p><p>
              &#8212; If the parameter has a pointer type or has a type of lvalue reference
              to non-const, the implementation may assume the validity of the pointee
              or referent, respectively, until the completion handler is invoked.
              [<span class="emphasis"><em>Note:</em></span> In other words, the program must guarantee
              the validity of the argument until the completion handler is invoked.
              &#8212;<span class="emphasis"><em>end note</em></span>]
            </p><p>
              &#8212; Otherwise, 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 completion handler.
            </p></div><div class="section" title="10.13.2.2.5.&#160;Associated executor"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.associated_executor"></a>10.13.2.2.5.&#160;Associated executor</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.assoc.exec"></a>
<a class="link" href="#async.reqmts.async.assoc.exec">[async.reqmts.async.assoc.exec]</a>
<a class="indexterm" name="idm168537669568"></a>
</span>
            </p><p>
              Certain objects that participate in asynchronous operations have an
              <span class="emphasis"><em>associated executor</em></span>. These are obtained as specified
              below.
            </p></div><div class="section" title="10.13.2.2.6.&#160;I/O executor"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.i_o_executor"></a>10.13.2.2.6.&#160;I/O executor</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.io.exec"></a>
<a class="link" href="#async.reqmts.async.io.exec">[async.reqmts.async.io.exec]</a>
<a class="indexterm" name="idm168537664160"></a>
</span>
            </p><p>
              All asynchronous operations in this Technical Specification have an
              associated executor object satisfying the <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">Executor
              requirements</a>. If 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. If 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.
            </p><p>
              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="10.13.2.2.7.&#160;Completion handler executor"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.completion_handler_executor"></a>10.13.2.2.7.&#160;Completion handler executor</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.handler.exec"></a>
<a class="link" href="#async.reqmts.async.handler.exec">[async.reqmts.async.handler.exec]</a>
<a class="indexterm" name="idm168542129136"></a>
</span>
            </p><p>
              A completion handler object of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>
              has an associated executor object <code class="computeroutput"><span class="identifier">ex2</span></code>
              of type <code class="computeroutput"><span class="identifier">Executor2</span></code> satisfying
              the <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">Executor requirements</a>.
              The type <code class="computeroutput"><span class="identifier">Executor2</span></code>
              is <code class="computeroutput"><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">CompletionHandler</span><span class="special">,</span> <span class="identifier">Executor1</span><span class="special">&gt;</span></code>. The object <code class="computeroutput"><span class="identifier">ex2</span></code>
              is obtained by performing <code class="computeroutput"><span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">CompletionHandler</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="10.13.2.2.8.&#160;Outstanding work"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.outstanding_work"></a>10.13.2.2.8.&#160;Outstanding work</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.work"></a>
<a class="link" href="#async.reqmts.async.work">[async.reqmts.async.work]</a>
<a class="indexterm" name="idm168542115728"></a>
</span>
            </p><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="10.13.2.2.9.&#160;Allocation of intermediate storage"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.allocation_of_intermediate_storage"></a>10.13.2.2.9.&#160;Allocation of intermediate storage</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.alloc"></a>
<a class="link" href="#async.reqmts.async.alloc">[async.reqmts.async.alloc]</a>
<a class="indexterm" name="idm168538623648"></a>
</span>
            </p><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 the <a class="link" href="#requirements.proto_allocator" title="10.13.2.1.&#160;Proto-allocator requirements"><code class="computeroutput"><span class="identifier">ProtoAllocator</span></code></a> 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 the <a class="link" href="#requirements.proto_allocator" title="10.13.2.1.&#160;Proto-allocator requirements"><code class="computeroutput"><span class="identifier">ProtoAllocator</span></code></a>
              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">CompletionHandler</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">CompletionHandler</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 Technical Specification:
            </p><p>
              &#8212; If required, allocate memory using only the completion handler's associated
              allocator.
            </p><p>
              &#8212; Prior to completion handler execution, deallocates any memory allocated.
            </p><p>
              [<span class="emphasis"><em>Note:</em></span> The implementation may perform operating
              system or underlying API calls that perform memory allocations not
              using the associated allocator. Invocations of the allocator functions
              may not introduce data races (See C++ Std, [res.on.data.races]). &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></div><div class="section" title="10.13.2.2.10.&#160;Execution of completion handler on completion of asynchronous operation"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.execution_of_completion_handler_on_completion_of_asynchronous_operation"></a>10.13.2.2.10.&#160;Execution of completion handler on completion of asynchronous
            operation</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.completion"></a>
<a class="link" href="#async.reqmts.async.completion">[async.reqmts.async.completion]</a>
<a class="indexterm" name="idm168538591232"></a>
</span>
            </p><p>
              When an asynchronous operation completes, the implementation constructs
              a zero-argument function object <code class="computeroutput"><span class="identifier">f</span></code>
              to invoke <code class="computeroutput"><span class="identifier">handler</span></code> with
              the results of the operation.
            </p><p>
              If an asynchonous operation completes immediately (that is, within
              the thread of execution calling the initiating function, and before
              the initiating function returns), the completion 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">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">alloc2</span><span class="special">)</span></code>. Otherwise, the completion 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">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">alloc2</span><span class="special">)</span></code>.
            </p></div><div class="section" title="10.13.2.2.11.&#160;Completion handlers and exceptions"><div class="titlepage"><div><div><h6 class="title"><a name="requirements.completion_handlers_and_exceptions"></a>10.13.2.2.11.&#160;Completion handlers and exceptions</h6></div></div></div><p>
              <span class="xrefid">
<a name="async.reqmts.async.exceptions"></a>
<a class="link" href="#async.reqmts.async.exceptions">[async.reqmts.async.exceptions]</a>
<a class="indexterm" name="idm168538571376"></a>
</span>
            </p><p>
              Completion handlers are permitted to throw exceptions. The effect of
              any exception propagated from the execution of a completion handler
              is determined by the executor which is executing the handler.
            </p></div></div><div class="section" title="10.13.2.3.&#160;Executor requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.executor"></a>10.13.2.3.&#160;Executor requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.executor"></a>
<a class="link" href="#async.reqmts.executor">[async.reqmts.executor]</a>
<a class="indexterm" name="idm168538566800"></a>
</span>
          </p><p>
            The library describes a standard set of requirements for <span class="emphasis"><em>executors</em></span>.
            A type meeting the Executor requirements embodies 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]) and <code class="computeroutput"><span class="identifier">Destructible</span></code>
            (C++ Std, [destructible]) 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 other 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">x1</span></code>
            and <code class="computeroutput"><span class="identifier">x2</span></code> denote values
            of type <code class="computeroutput"><span class="identifier">X</span></code>, <code class="computeroutput"><span class="identifier">cx1</span></code> and <code class="computeroutput"><span class="identifier">cx2</span></code>
            denote (possibly const) values of type <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">mx1</span></code> denotes an xvalue
            of type <code class="computeroutput"><span class="identifier">X</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 the <code class="computeroutput"><span class="identifier">Allocator</span></code> requirements (C++ Std, [allocator.requirements]),
            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">cx1</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">cx1</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">mx1</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">mx1</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">cx1</span> <span class="special">==</span>
                      <span class="identifier">cx2</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns <code class="computeroutput"><span class="keyword">true</span></code> only
                      if <code class="computeroutput"><span class="identifier">cx1</span></code> and
                      <code class="computeroutput"><span class="identifier">cx2</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>
                      Returning <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">cx1</span> <span class="special">!=</span>
                      <span class="identifier">cx2</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Same as <code class="computeroutput"><span class="special">!(</span><span class="identifier">cx1</span>
                      <span class="special">==</span> <span class="identifier">cx2</span><span class="special">)</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</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">x1</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">x1</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> Precondition:
                      A preceding call <code class="computeroutput"><span class="identifier">x2</span><span class="special">.</span><span class="identifier">on_work_started</span><span class="special">()</span></code> where <code class="computeroutput"><span class="identifier">x1</span>
                      <span class="special">==</span> <span class="identifier">x2</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</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: Creates an object <code class="computeroutput"><span class="identifier">f1</span></code>
                      initialized with <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> in the current thread of
                      execution. Calls <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code> at most once. The executor
                      may invoke <code class="computeroutput"><span class="identifier">f1</span></code>
                      prior to returning from <code class="computeroutput"><span class="identifier">dispatch</span></code>.<br>
                      <br> Executor implementations should use the supplied allocator
                      to allocate any memory required to store the function object.
                      Prior to invoking the function object, the executor shall deallocate
                      any memory allocated. [<span class="emphasis"><em>Note:</em></span> Executors
                      defined in this Technical Specification always use the supplied
                      allocator. &#8212;<span class="emphasis"><em>end note</em></span>] <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">f1</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</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: Creates an object <code class="computeroutput"><span class="identifier">f1</span></code>
                      initialized with <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> in the current thread of
                      execution. Calls <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code> at most once. The executor
                      shall not invoke <code class="computeroutput"><span class="identifier">f1</span></code>
                      in the current thread of execution prior to returning from
                      <code class="computeroutput"><span class="identifier">post</span></code>.<br>
                      <br> Executor implementations should use the supplied allocator
                      to allocate any memory required to store the function object.
                      Prior to invoking the function object, the executor shall deallocate
                      any memory allocated. [<span class="emphasis"><em>Note:</em></span> Executors
                      defined in this Technical Specification always use the supplied
                      allocator. &#8212;<span class="emphasis"><em>end note</em></span>] <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">f1</span></code>.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x1</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: Creates an object <code class="computeroutput"><span class="identifier">f1</span></code>
                      initialized with <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> in the current thread of
                      execution. Calls <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code> at most once. The executor
                      shall not invoke <code class="computeroutput"><span class="identifier">f1</span></code>
                      in the current thread of execution prior to returning from
                      <code class="computeroutput"><span class="identifier">defer</span></code>.<br>
                      <br> Executor implementations should use the supplied allocator
                      to allocate any memory required to store the function object.
                      Prior to invoking the function object, the executor shall deallocate
                      any memory allocated. [<span class="emphasis"><em>Note:</em></span> Executors
                      defined in this Technical Specification always use the supplied
                      allocator. &#8212;<span class="emphasis"><em>end note</em></span>] <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">f1</span></code>.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><p>
            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>,
            <code class="computeroutput"><span class="identifier">defer</span></code> 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></div><div class="section" title="10.13.2.4.&#160;Execution context requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.execution_context"></a>10.13.2.4.&#160;Execution context requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.executioncontext"></a>
<a class="link" href="#async.reqmts.executioncontext">[async.reqmts.executioncontext]</a>
<a class="indexterm" name="idm168538430000"></a>
</span>
          </p><p>
            An execution context shall be publicly and unambiguously derived from
            <code class="computeroutput"><span class="identifier">execution_context</span></code>, and
            meet the additional requirements listed below.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes an execution context class, and <code class="computeroutput"><span class="identifier">x</span></code>
            denotes an object of type <code class="computeroutput"><span class="identifier">X</span></code>.
          </p><div class="table"><a name="requirements.proposed_text.async.async_requirements.execution_context.t0"></a><p class="title"><b>Table&#160;4.&#160;ExecutionContext requirements</b></p><div class="table-contents"><table class="table" summary="ExecutionContext 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">executor_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      type meeting <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">executor</a>
                      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_executor</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">executor_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns an executor object that is associated with the execution
                      context.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.13.2.5.&#160;Service requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.service"></a>10.13.2.5.&#160;Service requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.service"></a>
<a class="link" href="#async.reqmts.service">[async.reqmts.service]</a>
<a class="indexterm" name="idm168538405408"></a>
</span>
          </p><p>
            A class is a <span class="emphasis"><em>service</em></span> if it 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>,
            or if it is publicly and unambiguously derived from another service.
            For a service <code class="computeroutput"><span class="identifier">S</span></code>, <code class="computeroutput"><span class="identifier">S</span><span class="special">::</span><span class="identifier">key_type</span></code> is valid and denotes a type
            (C++Std, [temp.deduct]), and <code class="computeroutput"><span class="identifier">is_base_of_v</span><span class="special">&lt;</span><span class="keyword">typename</span>
            <span class="identifier">S</span><span class="special">::</span><span class="identifier">key_type</span><span class="special">,</span>
            <span class="identifier">S</span><span class="special">&gt;</span></code>
            is <code class="computeroutput"><span class="keyword">true</span></code>.
          </p><p>
            A service defines an explicit constructor that can be invoked with a
            single lvalue argument referring to the <code class="computeroutput"><span class="identifier">execution_context</span></code>
            object that will own the service. Any additional constructors shall take
            a first lvalue argument referring to the <code class="computeroutput"><span class="identifier">execution_context</span></code>
            object that will own 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="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">int</span> <span class="identifier">some_value</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</span><span class="special">()</span> <span class="identifier">override</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</span></code>
            member function shall destroy all copies of user-defined function objects
            that are held by the service.
          </p></div><div class="section" title="10.13.2.6.&#160;Signature requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.signature"></a>10.13.2.6.&#160;Signature requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.reqmts.signature"></a>
<a class="link" href="#async.reqmts.signature">[async.reqmts.signature]</a>
<a class="indexterm" name="idm168538389264"></a>
</span>
          </p><p>
            A type satisfies the signature requirements if it is a call signature
            (C++ Std, [func.def]).
          </p></div></div><div class="section" title="10.13.3.&#160;Class template completion_handler_type"><div class="titlepage"><div><div><h4 class="title"><a name="classes.completion_handler_type"></a>10.13.3.&#160;Class template <code class="literal">completion_handler_type</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.handler.type"></a>
<a class="link" href="#async.handler.type">[async.handler.type]</a>
<a class="indexterm" name="idm168538384320"></a>
</span>
        </p><p>
          The <code class="computeroutput"><span class="identifier">completion_handler_type</span></code>
          class template is a type transformation (C++Std, [meta]) that transforms
          a <code class="computeroutput"><span class="identifier">CompletionToken</span></code> into
          a completion handler type that is based on a <code class="computeroutput"><span class="identifier">Signature</span></code>.
        </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">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">completion_handler_type</span>
      <span class="special">{</span>
        <span class="keyword">typedef</span> <span class="identifier">CompletionToken</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>
          The template parameter <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
          shall be an object type. The template parameter <code class="computeroutput"><span class="identifier">Signature</span></code>
          shall be a call signature (C++Std, [func.def]).
        </p><p>
          Specializations of <code class="computeroutput"><span class="identifier">completion_handler_type</span></code>
          shall define a nested type <code class="computeroutput"><span class="identifier">type</span></code>
          that satisfies the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
          requirements. An object of type <code class="computeroutput"><span class="identifier">type</span></code>
          shall be a function object with call signature <code class="computeroutput"><span class="identifier">Signature</span></code>,
          and <code class="computeroutput"><span class="identifier">type</span></code> shall be constructible
          from a rvalue of type <code class="computeroutput"><span class="identifier">CompletionToken</span></code>.
        </p></div><div class="section" title="10.13.4.&#160;Class template async_result"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_result"></a>10.13.4.&#160;Class template <code class="literal">async_result</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.async.result"></a>
<a class="link" href="#async.async.result">[async.async.result]</a>
<a class="indexterm" name="idm168537604992"></a>
</span>
        </p><p>
          The template parameter <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>
          is a completion handler type produced by <code class="computeroutput"><span class="identifier">completion_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><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">CompletionHandler</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">CompletionHandler</span><span class="special">&amp;)</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="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>
          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">CompletionHandler</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">CompletionHandler</span></code>.
        </p><div class="table"><a name="classes.proposed_text.async.async_result.t0"></a><p class="title"><b>Table&#160;5.&#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 the operand of a return
                    statement.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.13.5.&#160;Class template async_completion"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_completion"></a>10.13.5.&#160;Class template <code class="literal">async_completion</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.async.completion"></a>
<a class="link" href="#async.async.completion">[async.async.completion]</a>
<a class="indexterm" name="idm168537522752"></a>
</span>
        </p><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 completion handler
          type invoked on completion of the asynchronous operation.
        </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">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">completion_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>
          <span class="identifier">completion_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">CompletionToken</span><span class="special">&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">completion_handler</span><span class="special">;</span>
        <span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">completion_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>
          The template parameter <code class="computeroutput"><span class="identifier">Signature</span></code>
          shall be a call signature (C++Std, [func.def]).
        </p><div class="section" title="10.13.5.1.&#160;async_completion members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__async_completion__members"></a>10.13.5.1.&#160;<code class="literal">async_completion</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.async.completion.members"></a>
<a class="link" href="#async.async.completion.members">[async.async.completion.members]</a>
<a class="indexterm" name="idm168537473792"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">async_completion</span><span class="special">(</span><span class="identifier">CompletionToken</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> If <code class="computeroutput"><span class="identifier">CompletionToken</span></code>
              and <code class="computeroutput"><span class="identifier">completion_handler_type</span></code>
              are the same type, binds <code class="computeroutput"><span class="identifier">completion_handler</span></code>
              to <code class="computeroutput"><span class="identifier">t</span></code>; otherwise, initializes
              <code class="computeroutput"><span class="identifier">completion_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">completion_handler</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="emphasis"><em>see below</em></span> <span class="identifier">completion_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">completion_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">completion_handler_type</span></code>
              are the same type; otherwise, <code class="computeroutput"><span class="identifier">completion_handler_type</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.13.6.&#160;Class template associated_allocator"><div class="titlepage"><div><div><h4 class="title"><a name="classes.associated_allocator"></a>10.13.6.&#160;Class template <code class="literal">associated_allocator</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.assoc.alloc"></a>
<a class="link" href="#async.assoc.alloc">[async.assoc.alloc]</a>
<a class="indexterm" name="idm168537442944"></a>
</span>
        </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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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>
          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
          parameters <code class="computeroutput"><span class="identifier">T</span></code> and <code class="computeroutput"><span class="identifier">ProtoAllocator</span></code>; <code class="computeroutput"><span class="identifier">t</span></code>
          is a value of (possibly const) <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">ProtoAllocator</span></code>.
        </p><div class="table"><a name="classes.proposed_text.async.associated_allocator.t0"></a><p class="title"><b>Table&#160;6.&#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 the <a class="link" href="#requirements.proto_allocator" title="10.13.2.1.&#160;Proto-allocator requirements">proto-allocator</a>
                    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">ProtoAllocator</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="10.13.6.1.&#160;associated_allocator members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__associated_allocator__members"></a>10.13.6.1.&#160;<code class="literal">associated_allocator</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.assoc.alloc.members"></a>
<a class="link" href="#async.assoc.alloc.members">[async.assoc.alloc.members]</a>
<a class="indexterm" name="idm168537363568"></a>
</span>
          </p><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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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="10.13.7.&#160;Function get_associated_allocator"><div class="titlepage"><div><div><h4 class="title"><a name="functions.get_associated_allocator"></a>10.13.7.&#160;Function <code class="literal">get_associated_allocator</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.assoc.alloc.get"></a>
<a class="link" href="#async.assoc.alloc.get">[async.assoc.alloc.get]</a>
<a class="indexterm" name="idm168541045792"></a>
</span>
        </p><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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.8.&#160;Class execution_context"><div class="titlepage"><div><div><h4 class="title"><a name="classes.execution_context"></a>10.13.8.&#160;Class <code class="literal">execution_context</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.exec.ctx"></a>
<a class="link" href="#async.exec.ctx">[async.exec.ctx]</a>
<a class="indexterm" name="idm168541004960"></a>
</span>
        </p><p>
          Class <code class="computeroutput"><span class="identifier">execution_context</span></code>
          implements an extensible, type-safe, polymorphic set of services, indexed
          by service type.
        </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">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="10.13.9.&#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</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="identifier">destroy</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="keyword">typename</span> <span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</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="keyword">const</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>

    } // 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>
          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.
          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 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,
          <code class="computeroutput"><span class="identifier">make_service</span></code> exits via
          an exception of type <code class="computeroutput"><span class="identifier">service_already_exists</span></code>.
        </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</span><span class="special">()</span></code>.
        </p><div class="section" title="10.13.8.1.&#160;execution_context constructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__constructor"></a>10.13.8.1.&#160;<code class="literal">execution_context</code> constructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.cons"></a>
<a class="link" href="#async.exec.ctx.cons">[async.exec.ctx.cons]</a>
<a class="indexterm" name="idm168540907344"></a>
</span>
          </p><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> which contains
              no services. [<span class="emphasis"><em>Note:</em></span> An implementation might preload
              service of internal service types for its own use. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div></div><div class="section" title="10.13.8.2.&#160;execution_context destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__destructor"></a>10.13.8.2.&#160;<code class="literal">execution_context</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.dtor"></a>
<a class="link" href="#async.exec.ctx.dtor">[async.exec.ctx.dtor]</a>
<a class="indexterm" name="idm168540898384"></a>
</span>
          </p><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</span><span class="special">()</span></code>
              followed by <code class="computeroutput"><span class="identifier">destroy</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="10.13.8.3.&#160;execution_context operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__operations"></a>10.13.8.3.&#160;<code class="literal">execution_context</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.ops"></a>
<a class="link" href="#async.exec.ctx.ops">[async.exec.ctx.ops]</a>
<a class="indexterm" name="idm168540887056"></a>
</span>
          </p><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 addition to the
              set.<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 addition to the set.
            </p></blockquote></div></div><div class="section" title="10.13.8.4.&#160;execution_context protected operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__protected_operations"></a>10.13.8.4.&#160;<code class="literal">execution_context</code> protected operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.protected"></a>
<a class="link" href="#async.exec.ctx.protected">[async.exec.ctx.protected]</a>
<a class="indexterm" name="idm168540866224"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">shutdown</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 addition to the set, performs <code class="computeroutput"><span class="identifier">svc</span><span class="special">-&gt;</span><span class="identifier">shutdown</span><span class="special">()</span></code>.
              For each service in the set, <code class="computeroutput"><span class="identifier">svc</span><span class="special">-&gt;</span><span class="identifier">shutdown</span><span class="special">()</span></code> is called only once irrespective
              of the number of calls to <code class="computeroutput"><span class="identifier">shutdown</span></code>
              on the <code class="computeroutput"><span class="identifier">execution_context</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">destroy</span><span class="special">();</span>
</pre><p>
            [function_effects Destroys each service object in the <code class="computeroutput"><span class="identifier">execution_context</span></code>
            set, and removes it from the set, in reverse order of addition to the
            set.
          </p></div><div class="section" title="10.13.8.5.&#160;execution_context globals"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__globals"></a>10.13.8.5.&#160;<code class="literal">execution_context</code> globals</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.globals"></a>
<a class="link" href="#async.exec.ctx.globals">[async.exec.ctx.globals]</a>
<a class="indexterm" name="idm168540846096"></a>
</span>
          </p><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="keyword">typename</span> <span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</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>
              <span class="emphasis"><em>Effects:</em></span> If an object of type <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</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>,
              initialized as <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</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>
              <span class="emphasis"><em>Requires:</em></span> A service object of type <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</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>, initialized as <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</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="keyword">const</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>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="keyword">true</span></code>
              if an object of type <code class="computeroutput"><span class="identifier">Service</span><span class="special">::</span><span class="identifier">key_type</span></code>
              is present in <code class="computeroutput"><span class="identifier">ctx</span></code>,
              otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.13.9.&#160;Class execution_context::service"><div class="titlepage"><div><div><h4 class="title"><a name="classes.execution_context__service"></a>10.13.9.&#160;Class <code class="literal">execution_context::service</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.exec.ctx.svc"></a>
<a class="link" href="#async.exec.ctx.svc">[async.exec.ctx.svc]</a>
<a class="indexterm" name="idm168540763952"></a>
</span>
        </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">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="keyword">explicit</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="comment">// service operations:</span>

        <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">shutdown</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="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="10.13.9.1.&#160;execution_context::service members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__execution_context__service__members"></a>10.13.9.1.&#160;<code class="literal">execution_context::service</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.ctx.svc.members"></a>
<a class="link" href="#async.exec.ctx.svc.members">[async.exec.ctx.svc.members]</a>
<a class="indexterm" name="idm168540712272"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">explicit</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>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">context_</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">owner</span><span class="special">)</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">context_</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.13.10.&#160;Class template is_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.is_executor"></a>10.13.10.&#160;Class template <code class="literal">is_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.is.exec"></a>
<a class="link" href="#async.is.exec">[async.is.exec]</a>
<a class="indexterm" name="idm168540687824"></a>
</span>
        </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">&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="10.13.2.3.&#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="10.13.11.&#160;Executor argument tag"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_arg_t"></a>10.13.11.&#160;Executor argument tag</h4></div></div></div><p>
          <span class="xrefid">
<a name="async.executor.arg"></a>
<a class="link" href="#async.executor.arg">[async.executor.arg]</a>
<a class="indexterm" name="idm168540658656"></a>
</span>
        </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">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="10.13.2.3.&#160;Executor requirements">Executor requirements</a>.
        </p></div><div class="section" title="10.13.12.&#160;uses_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.uses_executor"></a>10.13.12.&#160;<code class="literal">uses_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.uses.executor"></a>
<a class="link" href="#async.uses.executor">[async.uses.executor]</a>
<a class="indexterm" name="idm168540636832"></a>
</span>
        </p><div class="section" title="10.13.12.1.&#160;uses_executor trait"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__uses_executor__trait"></a>10.13.12.1.&#160;<code class="literal">uses_executor</code> trait</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.uses.executor.trait"></a>
<a class="link" href="#async.uses.executor.trait">[async.uses.executor.trait]</a>
<a class="indexterm" name="idm168540631968"></a>
</span>
          </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">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">true_type</span></code>
            if a type <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">executor_type</span></code> exists and <code class="computeroutput"><span class="identifier">is_convertible</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">,</span>
            <span class="identifier">T</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">!=</span>
            <span class="keyword">false</span></code>, otherwise it shall be 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 if the first argument
            of a constructor has type <code class="computeroutput"><span class="identifier">executor_arg_t</span></code>
            and the second argument has type <code class="computeroutput"><span class="identifier">Executor</span></code>.
          </p></div><div class="section" title="10.13.12.2.&#160;uses-executor construction"><div class="titlepage"><div><div><h5 class="title"><a name="classes.uses_executor_construction"></a>10.13.12.2.&#160;uses-executor construction</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.uses.executor.cons"></a>
<a class="link" href="#async.uses.executor.cons">[async.uses.executor.cons]</a>
<a class="indexterm" name="idm168540591760"></a>
</span>
          </p><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 <code class="computeroutput"><span class="keyword">true</span></code>
            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 <code class="computeroutput"><span class="keyword">true</span></code>,
            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, <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></div></div><div class="section" title="10.13.13.&#160;Class template associated_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.associated_executor"></a>10.13.13.&#160;Class template <code class="literal">associated_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.assoc.exec"></a>
<a class="link" href="#async.assoc.exec">[async.assoc.exec]</a>
<a class="indexterm" name="idm168540539744"></a>
</span>
        </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">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="10.13.2.3.&#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;7.&#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="10.13.2.3.&#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="10.13.13.1.&#160;associated_executor members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__associated_executor__members"></a>10.13.13.1.&#160;<code class="literal">associated_executor</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.assoc.exec.members"></a>
<a class="link" href="#async.assoc.exec.members">[async.assoc.exec.members]</a>
<a class="indexterm" name="idm168540458928"></a>
</span>
          </p><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="10.13.14.&#160;Function get_associated_executor"><div class="titlepage"><div><div><h4 class="title"><a name="functions.get_associated_executor"></a>10.13.14.&#160;Function <code class="literal">get_associated_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.assoc.exec.get"></a>
<a class="link" href="#async.assoc.exec.get">[async.assoc.exec.get]</a>
<a class="indexterm" name="idm168540426128"></a>
</span>
        </p><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 <code class="computeroutput"><span class="keyword">true</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">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">get_associated_executor</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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.15.&#160;Class template executor_wrapper"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_wrapper"></a>10.13.15.&#160;Class template <code class="literal">executor_wrapper</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.exec.wrapper"></a>
<a class="link" href="#async.exec.wrapper">[async.exec.wrapper]</a>
<a class="indexterm" name="idm168540347872"></a>
</span>
        </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> 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="10.13.2.3.&#160;Executor requirements">Executor requirements</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">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="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="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="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="keyword">const</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="keyword">const</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">completion_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">completion_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">ProtoAllocator</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">ProtoAllocator</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><div class="section" title="10.13.15.1.&#160;executor_wrapper constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__constructors"></a>10.13.15.1.&#160;<code class="literal">executor_wrapper</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.cons"></a>
<a class="link" href="#async.exec.wrapper.cons">[async.exec.wrapper.cons]</a>
<a class="indexterm" name="idm168536988176"></a>
</span>
          </p><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>. Initializes
              <code class="computeroutput"><span class="identifier">wrapped_</span></code> by performing
              uses-executor construction, using the constructor argument <code class="computeroutput"><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>
              and the executor <code class="computeroutput"><span class="identifier">ex_</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> If <code class="computeroutput"><span class="identifier">U</span></code>
              is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
              or if <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is not convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>,
              the program is ill-formed.
            </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>.
              Initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              by performing uses-executor construction, using the constructor argument
              <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()</span></code>
              and the executor <code class="computeroutput"><span class="identifier">ex_</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> If <code class="computeroutput"><span class="identifier">U</span></code>
              is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
              or if <code class="computeroutput"><span class="identifier">OtherExecutor</span></code>
              is not convertible to <code class="computeroutput"><span class="identifier">Executor</span></code>,
              the program is ill-formed.
            </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>.
              Initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code>
              by performing uses-executor construction, using the constructor argument
              <code class="computeroutput"><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>
              and the executor <code class="computeroutput"><span class="identifier">ex_</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> If <code class="computeroutput"><span class="identifier">U</span></code>
              is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>
              the program is ill-formed.
            </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>. Initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code> by performing uses-executor
              construction, using the constructor argument <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">unwrap</span><span class="special">()</span></code> and the executor <code class="computeroutput"><span class="identifier">ex_</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>. Initializes <code class="computeroutput"><span class="identifier">wrapped_</span></code> by performing uses-executor
              construction, using the constructor argument <code class="computeroutput"><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> and the executor <code class="computeroutput"><span class="identifier">ex_</span></code>.
            </p></blockquote></div></div><div class="section" title="10.13.15.2.&#160;executor_wrapper access"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__access"></a>10.13.15.2.&#160;<code class="literal">executor_wrapper</code> access</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.access"></a>
<a class="link" href="#async.exec.wrapper.access">[async.exec.wrapper.access]</a>
<a class="indexterm" name="idm168536836480"></a>
</span>
          </p><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="10.13.15.3.&#160;executor_wrapper invocation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_wrapper__invocation"></a>10.13.15.3.&#160;<code class="literal">executor_wrapper</code> invocation</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.invocation"></a>
<a class="link" href="#async.exec.wrapper.invocation">[async.exec.wrapper.invocation]</a>
<a class="indexterm" name="idm168536814160"></a>
</span>
          </p><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="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="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="keyword">const</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="keyword">const</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><div class="section" title="10.13.15.4.&#160;Class template partial specialization async_result"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_partial_specialization___async_result_"></a>10.13.15.4.&#160;Class template partial specialization <code class="literal">async_result</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.async.result"></a>
<a class="link" href="#async.exec.wrapper.async.result">[async.exec.wrapper.async.result]</a>
<a class="indexterm" name="idm168536779248"></a>
</span>
          </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">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>

<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>
              as <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="10.13.15.5.&#160;Class template partial specialization associated_allocator"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_partial_specialization___associated_allocator_"></a>10.13.15.5.&#160;Class template partial specialization <code class="literal">associated_allocator</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.assoc.alloc"></a>
<a class="link" href="#async.exec.wrapper.assoc.alloc">[async.exec.wrapper.assoc.alloc]</a>
<a class="indexterm" name="idm168536708496"></a>
</span>
          </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">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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>

<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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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="10.13.15.6.&#160;Class template partial specialization associated_executor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.class_template_partial_specialization___associated_executor_"></a>10.13.15.6.&#160;Class template partial specialization <code class="literal">associated_executor</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.wrapper.assoc.exec"></a>
<a class="link" href="#async.exec.wrapper.assoc.exec">[async.exec.wrapper.assoc.exec]</a>
<a class="indexterm" name="idm168536643072"></a>
</span>
          </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">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>

<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="10.13.16.&#160;Function wrap"><div class="titlepage"><div><div><h4 class="title"><a name="functions.wrap"></a>10.13.16.&#160;Function <code class="literal">wrap</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.wrap"></a>
<a class="link" href="#async.wrap">[async.wrap]</a>
<a class="indexterm" name="idm168538353264"></a>
</span>
        </p><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 <code class="computeroutput"><span class="keyword">true</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">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">wrap</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">T</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>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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.17.&#160;Class template executor_work"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor_work"></a>10.13.17.&#160;Class template <code class="literal">executor_work</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.exec.work"></a>
<a class="link" href="#async.exec.work">[async.exec.work]</a>
<a class="indexterm" name="idm168536543728"></a>
</span>
        </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">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="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">executor_work</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="10.13.17.1.&#160;executor_work members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor_work__members"></a>10.13.17.1.&#160;<code class="literal">executor_work</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.exec.work.members"></a>
<a class="link" href="#async.exec.work.members">[async.exec.work.members]</a>
<a class="indexterm" name="idm168536481264"></a>
</span>
          </p><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">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">ex_</span><span class="special">)</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>, and sets <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">owns_</span></code>
              to <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="special">~</span><span class="identifier">executor_work</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 <code class="computeroutput"><span class="keyword">true</span></code>, 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><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><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 <code class="computeroutput"><span class="keyword">true</span></code>, 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="10.13.18.&#160;Function make_work"><div class="titlepage"><div><div><h4 class="title"><a name="functions.make_work"></a>10.13.18.&#160;Function <code class="literal">make_work</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.make.work"></a>
<a class="link" href="#async.make.work">[async.make.work]</a>
<a class="indexterm" name="idm168536377920"></a>
</span>
        </p><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 <code class="computeroutput"><span class="keyword">true</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">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 <code class="computeroutput"><span class="keyword">true</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="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 <code class="computeroutput"><span class="keyword">false</span></code> 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 <code class="computeroutput"><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">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 <code class="computeroutput"><span class="keyword">true</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">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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.19.&#160;Class system_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.system_executor"></a>10.13.19.&#160;Class <code class="literal">system_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.system.exec"></a>
<a class="link" href="#async.system.exec">[async.system.exec]</a>
<a class="indexterm" name="idm168538336592"></a>
</span>
        </p><p>
          Class <code class="computeroutput"><span class="identifier">system_executor</span></code> represents
          a set of rules where function objects are permitted to execute on any thread.
        </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">system_executor</span>
      <span class="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// constructors:</span>

        <span class="identifier">system_executor</span><span class="special">()</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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> satisfies
          the <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">Executor requirements</a>.
        </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 create <code class="computeroutput"><span class="identifier">thread</span></code>
          objects to run the submitted function objects. If the program is terminated
          by any means, 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>, these function objects
          are discarded without calling them.
        </p><div class="section" title="10.13.19.1.&#160;system_executor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__system_executor__operations"></a>10.13.19.1.&#160;<code class="literal">system_executor</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.system.exec.ops"></a>
<a class="link" href="#async.system.exec.ops">[async.system.exec.ops]</a>
<a class="indexterm" name="idm168542017536"></a>
</span>
          </p><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 an object with static
              storage duration whose type is derived from <code class="computeroutput"><span class="identifier">execution_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">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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> Equivalent to <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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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> Creates an object <code class="computeroutput"><span class="identifier">f1</span></code>
              initialized with <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>, and calls <code class="computeroutput"><span class="identifier">f1</span></code>
              as if in a thread of execution represented by a <code class="computeroutput"><span class="identifier">thread</span></code>
              object. 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="10.13.19.2.&#160;system_executor comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__system_executor__comparisons"></a>10.13.19.2.&#160;<code class="literal">system_executor</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.system.exec.comparisons"></a>
<a class="link" href="#async.system.exec.comparisons">[async.system.exec.comparisons]</a>
<a class="indexterm" name="idm168541953088"></a>
</span>
          </p><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="10.13.20.&#160;Class bad_executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.bad_executor"></a>10.13.20.&#160;Class <code class="literal">bad_executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.bad.exec"></a>
<a class="link" href="#async.bad.exec">[async.bad.exec]</a>
<a class="indexterm" name="idm168541931392"></a>
</span>
        </p><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><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>

<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 class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">what</span><span class="special">()</span></code> returns an implementation-defined NTBS.
          </p></blockquote></div></div><div class="section" title="10.13.21.&#160;Class executor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.executor"></a>10.13.21.&#160;Class <code class="literal">executor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.executor"></a>
<a class="link" href="#async.executor">[async.executor]</a>
<a class="indexterm" name="idm168541900224"></a>
</span>
        </p><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="10.13.2.3.&#160;Executor requirements">Executor
          requirements</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">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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">Allocator</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">experimental</span><span class="special">::</span>network_v1<span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="identifier">Allocator</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 <span class="emphasis"><em>target</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="10.13.2.3.&#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="10.13.21.1.&#160;executor constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__constructors"></a>10.13.21.1.&#160;<code class="literal">executor</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.cons"></a>
<a class="link" href="#async.executor.cons">[async.executor.cons]</a>
<a class="indexterm" name="idm168541672576"></a>
</span>
          </p><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>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><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">ProtoAllocator</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">ProtoAllocator</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>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="10.13.21.2.&#160;executor assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__assignment"></a>10.13.21.2.&#160;<code class="literal">executor</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.assign"></a>
<a class="link" href="#async.executor.assign">[async.executor.assign]</a>
<a class="indexterm" name="idm168536181392"></a>
</span>
          </p><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><div class="section" title="10.13.21.3.&#160;executor destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__destructor"></a>10.13.21.3.&#160;<code class="literal">executor</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.dtor"></a>
<a class="link" href="#async.executor.dtor">[async.executor.dtor]</a>
<a class="indexterm" name="idm168536115472"></a>
</span>
          </p><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="10.13.21.4.&#160;executor modifiers"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__modifiers"></a>10.13.21.4.&#160;<code class="literal">executor</code> modifiers</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.modifiers"></a>
<a class="link" href="#async.executor.modifiers">[async.executor.modifiers]</a>
<a class="indexterm" name="idm168536102528"></a>
</span>
          </p><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">ProtoAllocator</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">ProtoAllocator</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">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="10.13.21.5.&#160;executor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__operations"></a>10.13.21.5.&#160;<code class="literal">executor</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.ops"></a>
<a class="link" href="#async.executor.ops">[async.executor.ops]</a>
<a class="indexterm" name="idm168536066336"></a>
</span>
          </p><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>Requires:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="keyword">nullptr</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">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>Requires:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>.
            </p></blockquote></div><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>Requires:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>.
            </p></blockquote></div><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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.21.6.&#160;executor capacity"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__capacity"></a>10.13.21.6.&#160;<code class="literal">executor</code> capacity</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.capacity"></a>
<a class="link" href="#async.executor.capacity">[async.executor.capacity]</a>
<a class="indexterm" name="idm168535924080"></a>
</span>
          </p><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="10.13.21.7.&#160;executor target access"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__target_access"></a>10.13.21.7.&#160;<code class="literal">executor</code> target access</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.target"></a>
<a class="link" href="#async.executor.target">[async.executor.target]</a>
<a class="indexterm" name="idm168535909248"></a>
</span>
          </p><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>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 value.
            </p></blockquote></div></div><div class="section" title="10.13.21.8.&#160;executor comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__comparisons"></a>10.13.21.8.&#160;<code class="literal">executor</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.comparisons"></a>
<a class="link" href="#async.executor.comparisons">[async.executor.comparisons]</a>
<a class="indexterm" name="idm168535869792"></a>
</span>
          </p><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 of <code class="computeroutput"><span class="identifier">a</span></code>
              and <code class="computeroutput"><span class="identifier">f</span></code> is the target
              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="10.13.21.9.&#160;executor specialized algorithms"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__executor__specialized_algorithms"></a>10.13.21.9.&#160;<code class="literal">executor</code> specialized algorithms</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.executor.algo"></a>
<a class="link" href="#async.executor.algo">[async.executor.algo]</a>
<a class="indexterm" name="idm168535785280"></a>
</span>
          </p><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="10.13.22.&#160;Function dispatch"><div class="titlepage"><div><div><h4 class="title"><a name="functions.dispatch"></a>10.13.22.&#160;Function <code class="literal">dispatch</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.dispatch"></a>
<a class="link" href="#async.dispatch">[async.dispatch]</a>
<a class="indexterm" name="idm168535767568"></a>
</span>
        </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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the completion 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">completion_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">completion_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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_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 completion 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">completion_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">completion_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 <code class="computeroutput"><span class="keyword">true</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">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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><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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.23.&#160;Function post"><div class="titlepage"><div><div><h4 class="title"><a name="functions.post"></a>10.13.23.&#160;Function <code class="literal">post</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.post"></a>
<a class="link" href="#async.post">[async.post]</a>
<a class="indexterm" name="idm168535607984"></a>
</span>
        </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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the completion 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">completion_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">completion_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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_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 completion 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">completion_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">completion_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 <code class="computeroutput"><span class="keyword">true</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">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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><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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.24.&#160;Function defer"><div class="titlepage"><div><div><h4 class="title"><a name="functions.defer"></a>10.13.24.&#160;Function <code class="literal">defer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.defer"></a>
<a class="link" href="#async.defer">[async.defer]</a>
<a class="indexterm" name="idm168535448416"></a>
</span>
        </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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_handler</span><span class="special">)</span></code>.<br> &#8212; Obtains the completion 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">completion_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">completion_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="emphasis"><em>DEDUCED</em></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">CompletionHandler</span></code>
            be the completion handler type determined by performing <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span></code> of type <code class="computeroutput"><span class="identifier">CompletionHandler</span></code>, initialized as
            <code class="computeroutput"><span class="identifier">completion_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">CompletionHandler</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">completion_handler</span><span class="special">)</span></code>.<br>
            &#8212; Obtains the completion 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">completion_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 completion 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">completion_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">completion_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 <code class="computeroutput"><span class="keyword">true</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">ExecutionContext</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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><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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.13.25.&#160;Class template strand"><div class="titlepage"><div><div><h4 class="title"><a name="classes.strand"></a>10.13.25.&#160;Class template <code class="literal">strand</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.strand"></a>
<a class="link" href="#async.strand">[async.strand]</a>
<a class="indexterm" name="idm168535288768"></a>
</span>
        </p><p>
          The class template <code class="computeroutput"><span class="identifier">strand</span></code>
          is a wrapper around an object of type <code class="computeroutput"><span class="identifier">Executor</span></code>
          satisfying the <a class="link" href="#requirements.executor" title="10.13.2.3.&#160;Executor requirements">Executor requirements</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">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="keyword">noexcept</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">noexcept</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">noexcept</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="keyword">noexcept</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="keyword">noexcept</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">noexcept</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">noexcept</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="keyword">noexcept</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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>
          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 invokes <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>
          All member functions, except for the assignment operators and the destructor,
          do not introduce data races on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, including its ordered, non-concurrent
          state. Additionally, constructors and assignment operators do not introduce
          data races on lvalue arguments.
        </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 is as if
          <code class="computeroutput"><span class="identifier">f</span></code> had exited without throwing
          an exception.
        </p><div class="section" title="10.13.25.1.&#160;strand constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__constructors"></a>10.13.25.1.&#160;<code class="literal">strand</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.strand.cons"></a>
<a class="link" href="#async.strand.cons">[async.strand.cons]</a>
<a class="indexterm" name="idm168535078080"></a>
</span>
          </p><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> as <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> <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">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              Initializes <code class="computeroutput"><span class="identifier">inner_ex_</span></code>
              as <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> <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">strand</span><span class="special">&lt;</span><span class="identifier">Executor</span><span class="special">&gt;</span></code>.
              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">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> <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">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>.
              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">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> <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">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>.
              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">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> <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="10.13.25.2.&#160;strand assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__assignment"></a>10.13.25.2.&#160;<code class="literal">strand</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.strand.assign"></a>
<a class="link" href="#async.strand.assign">[async.strand.assign]</a>
<a class="indexterm" name="idm168534949376"></a>
</span>
          </p><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> <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>
              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> <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>
              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> <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">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> Assigns <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">inner_ex_</span></code>
              to <code class="computeroutput"><span class="identifier">inner_ex_</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><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> <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">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> Assigns <code class="computeroutput"><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> to <code class="computeroutput"><span class="identifier">inner_ex_</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 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="10.13.25.3.&#160;strand destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__destructor"></a>10.13.25.3.&#160;<code class="literal">strand</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.strand.dtor"></a>
<a class="link" href="#async.strand.dtor">[async.strand.dtor]</a>
<a class="indexterm" name="idm168534828080"></a>
</span>
          </p><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>.
              After this destructor completes, objects that were added to the strand
              but have not yet been executed will be executed in a way that meets
              the guarantees of ordering and non-concurrency.
            </p></blockquote></div></div><div class="section" title="10.13.25.4.&#160;strand operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__operations"></a>10.13.25.4.&#160;<code class="literal">strand</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.strand.ops"></a>
<a class="link" href="#async.strand.ops">[async.strand.ops]</a>
<a class="indexterm" name="idm168534816816"></a>
</span>
          </p><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 running 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>. [<span class="emphasis"><em>Note:</em></span>
              That is, the current thread of execution's call chain includes a function
              that was submitted to the strand. &#8212;<span class="emphasis"><em>end note</em></span>]
            </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">ProtoAllocator</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">ProtoAllocator</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> <span class="special">==</span> <span class="keyword">true</span></code>, 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>. [<span class="emphasis"><em>Note:</em></span> If
              <code class="computeroutput"><span class="identifier">f</span></code> exits via an exception,
              the exception propagates to the caller of <code class="computeroutput"><span class="identifier">dispatch</span><span class="special">()</span></code>. &#8212;<span class="emphasis"><em>end note</em></span>] 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><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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.25.5.&#160;strand comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__strand__comparisons"></a>10.13.25.5.&#160;<code class="literal">strand</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.strand.comparisons"></a>
<a class="link" href="#async.strand.comparisons">[async.strand.comparisons]</a>
<a class="indexterm" name="idm168534701952"></a>
</span>
          </p><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="10.13.26.&#160;Class template use_future_t"><div class="titlepage"><div><div><h4 class="title"><a name="classes.use_future_t"></a>10.13.26.&#160;Class template <code class="literal">use_future_t</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.use.future"></a>
<a class="link" href="#async.use.future">[async.use.future]</a>
<a class="indexterm" name="idm168537320160"></a>
</span>
        </p><p>
          The class template <code class="computeroutput"><span class="identifier">use_future_t</span></code>
          defines a set of <a class="link" href="#classes.completion_handler_type" title="10.13.3.&#160;Class template completion_handler_type">completion
          token types</a> for use with asynchronous operations.
        </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">ProtoAllocator</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">ProtoAllocator</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_type</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">OtherProtoAllocator</span><span class="special">&gt;</span> <span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">OtherProtoAllocator</span><span class="special">&gt;</span>
          <span class="identifier">rebind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">OtherProtoAllocator</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><div class="section" title="10.13.26.1.&#160;use_future_t constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__use_future_t__constructors"></a>10.13.26.1.&#160;<code class="literal">use_future_t</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.use.future.cons"></a>
<a class="link" href="#async.use.future.cons">[async.use.future.cons]</a>
<a class="indexterm" name="idm168534688688"></a>
</span>
          </p><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 a 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_type</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>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <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="10.13.26.2.&#160;use_future_t members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__use_future_t__members"></a>10.13.26.2.&#160;<code class="literal">use_future_t</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.use.future.members"></a>
<a class="link" href="#async.use.future.members">[async.use.future.members]</a>
<a class="indexterm" name="idm168534665200"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">OtherProtoAllocator</span><span class="special">&gt;</span> <span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">OtherProtoAllocator</span><span class="special">&gt;</span>
  <span class="identifier">rebind</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">OtherProtoAllocator</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="10.13.26.3.&#160;use_future_t traits"><div class="titlepage"><div><div><h5 class="title"><a name="classes.use_future_t_traits"></a>10.13.26.3.&#160;<code class="literal">use_future_t</code> traits</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.use.future.traits"></a>
<a class="link" href="#async.use.future.traits">[async.use.future.traits]</a>
<a class="indexterm" name="idm168534638304"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">completion_handler_type</span><span class="special">&lt;</span><span class="identifier">use_future_t</span><span class="special">&lt;</span><span class="identifier">ProtoAllocator</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>
            Let <code class="computeroutput"><span class="identifier">F</span></code> be the nested function
            object type <code class="computeroutput"><span class="identifier">type</span></code>.
          </p><p>
            An object <code class="computeroutput"><span class="identifier">t1</span></code> of type
            <code class="computeroutput"><span class="identifier">F</span></code> is an asynchronous
            provider with an associated shared state (C++Std, [futures.state]). The
            type <code class="computeroutput"><span class="identifier">F</span></code> provides <code class="computeroutput"><span class="identifier">F</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">F</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>
            <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</span></code>
            is valid and when an object <code class="computeroutput"><span class="identifier">r1</span></code>
            of type <code class="computeroutput"><span class="identifier">async_result</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</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">F</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_t&lt;T<sub><span class="emphasis"><em>i</em></span></sub>&gt;</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">F</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;8.&#160;completion_handler_type&lt;use_future_t&lt;ProtoAllocator&gt;,
            R(Args...)&gt;::type semantics</b></p><div class="table-contents"><table class="table" summary="completion_handler_type&lt;use_future_t&lt;ProtoAllocator&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">&lt;</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
                    </p>
                  </th><th>
                    <p>
                      <code class="computeroutput"><span class="identifier">F</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</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="10.13.27.&#160;Partial class template specialization async_result for packaged_task"><div class="titlepage"><div><div><h4 class="title"><a name="classes.async_result_packaged_task"></a>10.13.27.&#160;Partial class template specialization <code class="literal">async_result</code>
        for <code class="literal">packaged_task</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.packaged.task.specializations"></a>
<a class="link" href="#async.packaged.task.specializations">[async.packaged.task.specializations]</a>
<a class="indexterm" name="idm168534467264"></a>
</span>
        </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">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="keyword">explicit</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>

<span class="keyword">explicit</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>
</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="10.13.28.&#160;Class template packaged_handler"><div class="titlepage"><div><div><h4 class="title"><a name="classes.packaged_handler"></a>10.13.28.&#160;Class template <code class="literal">packaged_handler</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.package.handler"></a>
<a class="link" href="#async.package.handler">[async.package.handler]</a>
<a class="indexterm" name="idm168534399200"></a>
</span>
        </p><p>
          Class template <code class="computeroutput"><span class="identifier">packaged_handler</span></code>
          is an adapter to enable the use of packaged tasks with asynchronous operations
          as a completion handler with an associated allocator.
        </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="special">,</span> <span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">packaged_handler</span><span class="special">;</span> <span class="comment">// undefined</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">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</span><span class="special">&gt;</span>
      <span class="keyword">class</span> <span class="identifier">packaged_handler</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...),</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</span> <span class="identifier">allocator_type</span><span class="special">;</span>

        <span class="comment">// packaged_handler construct / copy / assign:</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">ProtoAllocator</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>
        <span class="identifier">packaged_handler</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">packaged_handler</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">packaged_handler</span><span class="special">(</span><span class="identifier">packaged_handler</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="identifier">packaged_handler</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">packaged_handler</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">packaged_handler</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_handler</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</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="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
        <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Args</span><span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>

      <span class="keyword">private</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;</span> <span class="identifier">task_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
        <span class="identifier">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.28.1.&#160;packaged_handler members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_handler__members"></a>10.13.28.1.&#160;<code class="literal">packaged_handler</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.package.handler.members"></a>
<a class="link" href="#async.package.handler.members">[async.package.handler.members]</a>
<a class="indexterm" name="idm168534302528"></a>
</span>
          </p><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">ProtoAllocator</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> Initializes <code class="computeroutput"><span class="identifier">task_</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">token</span><span class="special">.</span><span class="identifier">f_</span><span class="special">)</span></code>
              and initializes <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><pre class="programlisting"><span class="identifier">packaged_handler</span><span class="special">(</span><span class="identifier">packaged_handler</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</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> Initializes <code class="computeroutput"><span class="identifier">task_</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">rhs</span><span class="special">.</span><span class="identifier">task_</span><span class="special">)</span></code>
              and initializes <code class="computeroutput"><span class="identifier">allocator_</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">rhs</span><span class="special">.</span><span class="identifier">allocator_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">packaged_handler</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_handler</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</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 <code class="computeroutput"><span class="identifier">task_</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">rhs</span><span class="special">.</span><span class="identifier">task_</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">allocator_</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">rhs</span><span class="special">.</span><span class="identifier">allocator_</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">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><pre class="programlisting"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</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">task_</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Args</span><span class="special">...</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">task_</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>.
            </p></blockquote></div></div><div class="section" title="10.13.28.2.&#160;Partial class template specialization async_result"><div class="titlepage"><div><div><h5 class="title"><a name="classes.async_result_packaged_handler"></a>10.13.28.2.&#160;Partial class template specialization <code class="literal">async_result</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="async.package.handler.async.result"></a>
<a class="link" href="#async.package.handler.async.result">[async.package.handler.async.result]</a>
<a class="indexterm" name="idm168541578912"></a>
</span>
          </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">R</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">R</span><span class="special">(</span><span class="identifier">Args</span><span class="special">...),</span> <span class="identifier">ProtoAllocator</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="keyword">explicit</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 provides a partial specialization of <code class="computeroutput"><span class="identifier">async_result</span></code> that meets the <a class="link" href="#classes.async_result" title="10.13.4.&#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">ProtoAllocator</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 <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><div class="section" title="10.13.29.&#160;Class template packaged_token"><div class="titlepage"><div><div><h4 class="title"><a name="classes.packaged_token"></a>10.13.29.&#160;Class template <code class="literal">packaged_token</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.package.token"></a>
<a class="link" href="#async.package.token">[async.package.token]</a>
<a class="indexterm" name="idm168537273600"></a>
</span>
        </p><p>
          Class template <code class="computeroutput"><span class="identifier">packaged_handler</span></code>
          is an adapter to enable the use of packaged tasks with asynchronous operations
          as a completion token. The specification of the packaged task's <code class="computeroutput"><span class="identifier">Signature</span></code> is deferred until the completion
          token is transformed into a completion handler.
        </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">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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">allocator_type</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">ProtoAllocator</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">ProtoAllocator</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">completion_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">ProtoAllocator</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">ProtoAllocator</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="10.13.29.1.&#160;packaged_token members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__packaged_token__members"></a>10.13.29.1.&#160;<code class="literal">packaged_token</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="async.package.token.members"></a>
<a class="link" href="#async.package.token.members">[async.package.token.members]</a>
<a class="indexterm" name="idm168541459024"></a>
</span>
          </p><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> Initializes <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 constructs <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">allocator_type</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> Initializes <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><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="10.13.30.&#160;Function package"><div class="titlepage"><div><div><h4 class="title"><a name="functions.package"></a>10.13.30.&#160;Function <code class="literal">package</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="async.package"></a>
<a class="link" href="#async.package">[async.package]</a>
<a class="indexterm" name="idm168541422064"></a>
</span>
        </p><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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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="10.14.&#160;Basic I/O services"><div class="titlepage"><div><div><h3 class="title"><a name="network.basic_io_services"></a>10.14.&#160;Basic I/O services</h3></div></div></div><p>
        <span class="xrefid">
<a name="io_service"></a>
<a class="link" href="#io_service">[io_service]</a>
<a class="indexterm" name="idm168541388032"></a>
</span>

      </p><div class="section" title="10.14.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>10.14.1.&#160;Header <code class="literal">&lt;experimental/io_service&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="io_service.synop"></a>
<a class="link" href="#io_service.synop">[io_service.synop]</a>
<a class="indexterm" name="idm168541382928"></a>
</span>
        </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> <a class="link" href="#classes.io_service" title="10.14.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="10.14.2.&#160;Class io_service"><div class="titlepage"><div><div><h4 class="title"><a name="classes.io_service"></a>10.14.2.&#160;Class <code class="literal">io_service</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="io_service.io_service"></a>
<a class="link" href="#io_service.io_service">[io_service.io_service]</a>
<a class="indexterm" name="idm168541368928"></a>
</span>
        </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">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="10.14.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="keyword">int</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="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="keyword">noexcept</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>
          The class <code class="computeroutput"><span class="identifier">io_service</span></code> satsifies
          the <a class="link" href="#requirements.execution_context" title="10.13.2.4.&#160;Execution context requirements">ExecutionContext type
          requirements</a>.
        </p><p>
          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="10.5.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="10.13.2.2.&#160;Requirements on asynchronous operations">asynchronous
          operations</a>.
        </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">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, to any executor of the <code class="computeroutput"><span class="identifier">io_service</span></code>.
        </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 any executor of the <code class="computeroutput"><span class="identifier">io_service</span></code>, 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 of execution. [<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="10.14.2.1.&#160;io_service members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__members"></a>10.14.2.1.&#160;<code class="literal">io_service</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="io_service.io_service.members"></a>
<a class="link" href="#io_service.io_service.members">[io_service.io_service.members]</a>
<a class="indexterm" name="idm168534185008"></a>
</span>
          </p><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="keyword">int</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="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 outstanding 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 propagates
              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 is 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 function
              objects 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_one_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_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 outstanding 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 propagates
              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 is 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 function
              objects 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 outstanding 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 propagates
              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 is 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 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 function
              objects 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">bool</span> <span class="identifier">stopped</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 <code class="computeroutput"><span class="identifier">io_service</span></code> is
              stopped.
            </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="10.14.3.&#160;Class io_service::executor_type"><div class="titlepage"><div><div><h4 class="title"><a name="classes.io_service__executor_type"></a>10.14.3.&#160;Class <code class="literal">io_service::executor_type</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="io_service.exec"></a>
<a class="link" href="#io_service.exec">[io_service.exec]</a>
<a class="indexterm" name="idm168538223664"></a>
</span>
        </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">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="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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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">ProtoAllocator</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="10.13.2.3.&#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="10.14.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>10.14.3.1.&#160;<code class="literal">io_service::executor_type</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="io_service.exec.cons"></a>
<a class="link" href="#io_service.exec.cons">[io_service.exec.cons]</a>
<a class="indexterm" name="idm168537190272"></a>
</span>
          </p><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>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>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="10.14.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>10.14.3.2.&#160;<code class="literal">io_service::executor_type</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="io_service.exec.assign"></a>
<a class="link" href="#io_service.exec.assign">[io_service.exec.assign]</a>
<a class="indexterm" name="idm168537166528"></a>
</span>
          </p><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="10.14.3.3.&#160;io_service::executor_type operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__executor_type__operations"></a>10.14.3.3.&#160;<code class="literal">io_service::executor_type</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="io_service.exec.ops"></a>
<a class="link" href="#io_service.exec.ops">[io_service.exec.ops]</a>
<a class="indexterm" name="idm168534012384"></a>
</span>
          </p><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 running 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. [<span class="emphasis"><em>Note:</em></span> That is, the current thread of
              execution's call chain includes a run function. &#8212;<span class="emphasis"><em>end note</em></span>]
            </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> Increment 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> Decrement 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">ProtoAllocator</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">ProtoAllocator</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 <code class="computeroutput"><span class="keyword">true</span></code>,
              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>. [<span class="emphasis"><em>Note:</em></span> If
              <code class="computeroutput"><span class="identifier">f</span></code> exits via an exception,
              the exception propagates to the caller of <code class="computeroutput"><span class="identifier">dispatch</span><span class="special">()</span></code>. &#8212;<span class="emphasis"><em>end note</em></span>] Otherwise,
              calls <code class="computeroutput"><span class="identifier">post</span><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> <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">Func</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ProtoAllocator</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">ProtoAllocator</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> Adds <code class="computeroutput"><span class="identifier">f</span></code>
              to 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">ProtoAllocator</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">ProtoAllocator</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> Adds <code class="computeroutput"><span class="identifier">f</span></code>
              to the <code class="computeroutput"><span class="identifier">io_service</span></code>.
            </p></blockquote></div></div><div class="section" title="10.14.3.4.&#160;io_service::executor_type comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__io_service__executor_type__comparisons"></a>10.14.3.4.&#160;<code class="literal">io_service::executor_type</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="io_service.exec.comparisons"></a>
<a class="link" href="#io_service.exec.comparisons">[io_service.exec.comparisons]</a>
<a class="indexterm" name="idm168533910432"></a>
</span>
          </p><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="identifier">addressof</span><span class="special">(</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="identifier">addressof</span><span class="special">(</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="10.15.&#160;Timers"><div class="titlepage"><div><div><h3 class="title"><a name="network.timers"></a>10.15.&#160;Timers</h3></div></div></div><p>
        <span class="xrefid">
<a name="timer"></a>
<a class="link" href="#timer">[timer]</a>
<a class="indexterm" name="idm168537140336"></a>
</span>
This clause 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="10.15.1.&#160;Header &lt;experimental/timer&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_timer___synopsis"></a>10.15.1.&#160;Header <code class="literal">&lt;experimental/timer&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="timer.synop"></a>
<a class="link" href="#timer.synop">[timer.synop]</a>
<a class="indexterm" name="idm168537102160"></a>
</span>
        </p><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="10.15.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="10.15.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="10.15.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.timers_requirements"></a>10.15.2.&#160;Requirements</h4></div></div></div><p>
          <span class="xrefid">
<a name="timer.reqmts"></a>
<a class="link" href="#timer.reqmts">[timer.reqmts]</a>
<a class="indexterm" name="idm168537059792"></a>
</span>

        </p><div class="section" title="10.15.2.1.&#160;Wait traits requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.wait_traits"></a>10.15.2.1.&#160;Wait traits requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="timer.reqmts.waittraits"></a>
<a class="link" href="#timer.reqmts.waittraits">[timer.reqmts.waittraits]</a>
<a class="indexterm" name="idm168537055392"></a>
</span>
          </p><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 (possibly const) 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 (possibly
            const) 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;9.&#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 duration until 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="10.15.3.&#160;Class template wait_traits"><div class="titlepage"><div><div><h4 class="title"><a name="classes.wait_traits"></a>10.15.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="10.15.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><div class="section" title="10.15.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>10.15.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> Let <code class="computeroutput"><span class="identifier">now</span></code>
              be <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code>.
              If <code class="computeroutput"><span class="identifier">now</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></code>
              is before <code class="computeroutput"><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">now</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></code>
              is after <code class="computeroutput"><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">now</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.15.4.&#160;Class template basic_waitable_timer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_waitable_timer"></a>10.15.4.&#160;Class template <code class="literal">basic_waitable_timer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="timer.waitable"></a>
<a class="link" href="#timer.waitable">[timer.waitable]</a>
<a class="indexterm" name="idm168532713680"></a>
</span>
        </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">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_type</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_type</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="keyword">noexcept</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="emphasis"><em>DEDUCED</em></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="10.15.4.1.&#160;basic_waitable_timer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__constructors"></a>10.15.4.1.&#160;<code class="literal">basic_waitable_timer</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="timer.waitable.cons"></a>
<a class="link" href="#timer.waitable.cons">[timer.waitable.cons]</a>
<a class="indexterm" name="idm168532604784"></a>
</span>
          </p><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> Equivalent to <code class="computeroutput"><span class="identifier">basic_waitable_timer</span><span class="special">(</span><span class="identifier">ios</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>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">t</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> Sets the expiry time as if by calling
              <code class="computeroutput"><span class="identifier">expires_after</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> <span class="keyword">noexcept</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></code> is equal to the prior value of <code class="computeroutput"><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">time_point</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="10.15.4.2.&#160;basic_waitable_timer destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__destructor"></a>10.15.4.2.&#160;<code class="literal">basic_waitable_timer</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="timer.waitable.dtor"></a>
<a class="link" href="#timer.waitable.dtor">[timer.waitable.dtor]</a>
<a class="indexterm" name="idm168532532080"></a>
</span>
          </p><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="10.15.4.3.&#160;basic_waitable_timer assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__assignment"></a>10.15.4.3.&#160;<code class="literal">basic_waitable_timer</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="timer.waitable.assign"></a>
<a class="link" href="#timer.waitable.assign">[timer.waitable.assign]</a>
<a class="indexterm" name="idm168532521840"></a>
</span>
          </p><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></code> is equal to the prior value of <code class="computeroutput"><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">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="10.15.4.4.&#160;basic_waitable_timer operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_waitable_timer__operations"></a>10.15.4.4.&#160;<code class="literal">basic_waitable_timer</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="timer.waitable.ops"></a>
<a class="link" href="#timer.waitable.ops">[timer.waitable.ops]</a>
<a class="indexterm" name="idm168532486864"></a>
</span>
          </p><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. Completion handlers for canceled 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> yields <code class="computeroutput"><span class="keyword">true</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 canceled.
            </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 outstanding asynchronous wait
              operation that was initiated first, if any, to complete as soon as
              possible. The completion handler for the canceled operation is 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> yields <code class="computeroutput"><span class="keyword">true</span></code>.
            </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 an operation was cancelled, otherwise <code class="computeroutput"><span class="number">0</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> 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><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> Cancels outstanding asynchronous wait
              operations, as if by calling <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>. Sets the expiry time associated
              with the timer.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> The number of operations that were canceled.
            </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_type</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="identifier">ec</span>
              <span class="special">||</span> <span class="special">!(</span><span class="identifier">clock_type</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="emphasis"><em>DEDUCED</em></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>
              <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 completion handler is submitted for execution only when
              the condition <code class="computeroutput"><span class="identifier">ec</span> <span class="special">||</span>
              <span class="special">!(</span><span class="identifier">clock_type</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>
              yields <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div></div></div></div><div class="section" title="10.16.&#160;Buffers"><div class="titlepage"><div><div><h3 class="title"><a name="network.buffers"></a>10.16.&#160;Buffers</h3></div></div></div><p>
        <span class="xrefid">
<a name="buffer"></a>
<a class="link" href="#buffer">[buffer]</a>
<a class="indexterm" name="idm168533807632"></a>
</span>

      </p><div class="section" title="10.16.1.&#160;Header &lt;experimental/buffer&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_buffer___synopsis"></a>10.16.1.&#160;Header <code class="literal">&lt;experimental/buffer&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.synop"></a>
<a class="link" href="#buffer.synop">[buffer.synop]</a>
<a class="indexterm" name="idm168533802624"></a>
</span>
        </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">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="10.16.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="10.16.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="10.16.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="10.16.6.&#160;Class const_buffers_1">const_buffers_1</a><span class="special">;</span>

      // <a class="link" href="#classes.buffer_type_traits" title="10.16.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</span><span class="special">;</span>

      // <a class="link" href="#functions.buffer_cast" title="10.16.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="10.16.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="10.16.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="10.16.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="10.16.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">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string_view</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">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">&gt;</span>
        <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string_view</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">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="10.16.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="10.16.14.&#160;Class template dynamic_string_buffer">dynamic_string_buffer</a><span class="special">;</span>

      // <a class="link" href="#functions.dynamic_buffer" title="10.16.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="10.16.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="10.16.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="10.16.18.&#160;Class transfer_exactly">transfer_exactly</a><span class="special">;</span>

      // <a class="link" href="#functions.read" title="10.16.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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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="10.16.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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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="10.16.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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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="10.16.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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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="10.16.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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">string_view</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">DynamicBuffer</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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                          <span class="identifier">string_view</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="10.16.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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">string_view</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="10.16.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.buffers_requirements"></a>10.16.2.&#160;Requirements</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.reqmts"></a>
<a class="link" href="#buffer.reqmts">[buffer.reqmts]</a>
<a class="indexterm" name="idm168530755120"></a>
</span>

        </p><div class="section" title="10.16.2.1.&#160;Mutable buffer sequence requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.mutable_buffers"></a>10.16.2.1.&#160;Mutable buffer sequence requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.mutablebuffersequence"></a>
<a class="link" href="#buffer.reqmts.mutablebuffersequence">[buffer.reqmts.mutablebuffersequence]</a>
<a class="indexterm" name="idm168530750720"></a>
</span>
          </p><p>
            A <span class="emphasis"><em>mutable buffer sequence</em></span> satisfies the requirements
            for a <a class="link" href="#requirements.const_buffers" title="10.16.2.2.&#160;Constant buffer sequence requirements">constant buffer sequence</a>
            as well as the requirements in the table below.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a constant buffer sequence class, <code class="computeroutput"><span class="identifier">x</span></code>
            denotes a (possibly const) 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;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>
                      convertible to <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
                    </p>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
</p><pre class="programlisting"><span class="identifier">X</span> <span class="identifier">u</span><span class="special">(</span><span class="identifier">x</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">u</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">x</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></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.16.2.2.&#160;Constant buffer sequence requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.const_buffers"></a>10.16.2.2.&#160;Constant buffer sequence requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.constbuffersequence"></a>
<a class="link" href="#buffer.reqmts.constbuffersequence">[buffer.reqmts.constbuffersequence]</a>
<a class="indexterm" name="idm168530665904"></a>
</span>
          </p><p>
            A <span class="emphasis"><em>constant buffer sequence</em></span> satisfies the requirements
            for <code class="computeroutput"><span class="identifier">Destructible</span></code> (C++
            Std, [destructible]) and <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            (C++ Std, [copyconstructible]), as well as the requirements in the table
            below.
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">X</span></code>
            denotes a constant buffer sequence class, <code class="computeroutput"><span class="identifier">x</span></code>
            denotes a (possibly const) 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;11.&#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>
                      convertible to <code class="computeroutput"><span class="identifier">const_buffer</span></code>
                    </p>
                  </td><td>
                  </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">X</span><span class="special">::</span><span class="identifier">value_type</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><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="identifier">u</span><span class="special">(</span><span class="identifier">x</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">u</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">u</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">x</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="identifier">x</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      convertible to <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">const_iterator</span></code>
                    </p>
                  </td><td>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      convertible to <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><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="10.16.2.3.&#160;Dynamic buffer requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.dynamic_buffers"></a>10.16.2.3.&#160;Dynamic buffer requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.dynamicbuffer"></a>
<a class="link" href="#buffer.reqmts.dynamicbuffer">[buffer.reqmts.dynamicbuffer]</a>
<a class="indexterm" name="idm168530571616"></a>
</span>
          </p><p>
            A dynamic buffer 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, 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 object is appended
            to the input sequence of the same object.
          </p><p>
            A dynamic buffer 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 class, <code class="computeroutput"><span class="identifier">x</span></code>
            denotes a value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">x1</span></code> denotes a (possibly
            const) value of type <code class="computeroutput"><span class="identifier">X</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>.
          </p><div class="table"><a name="requirements.proposed_text.buffers.buffers_requirements.dynamic_buffers.t0"></a><p class="title"><b>Table&#160;12.&#160;DynamicBuffer requirements</b></p><div class="table-contents"><table class="table" summary="DynamicBuffer 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="10.16.2.2.&#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="10.16.2.2.&#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 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>
                      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
                      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></code>
                      exceeds <code class="computeroutput"><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="10.16.2.4.&#160;Requirements on synchronous read operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.synchronous_read_operations"></a>10.16.2.4.&#160;Requirements on synchronous read operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.sync.read"></a>
<a class="link" href="#buffer.reqmts.sync.read">[buffer.reqmts.sync.read]</a>
<a class="indexterm" name="idm168530455712"></a>
</span>
          </p><p>
            In this Technical Specification, a <span class="emphasis"><em>synchronous read operation</em></span>
            is a function that reads data into a mutable buffer sequence argument
            of a type meeting <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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="10.16.2.5.&#160;Requirements on asynchronous read operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_read_operations"></a>10.16.2.5.&#160;Requirements on asynchronous read operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.async.read"></a>
<a class="link" href="#buffer.reqmts.async.read">[buffer.reqmts.async.read]</a>
<a class="indexterm" name="idm168530448640"></a>
</span>
          </p><p>
            In this Technical Specification, an <span class="emphasis"><em>asynchronous read operation</em></span>
            is an <a class="link" href="#requirements.asynchronous_operations" title="10.13.2.2.&#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="10.16.2.1.&#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 shall ensure the memory remains valid until:
          </p><p>
            &#8212; the last copy of the buffer sequence is destroyed, or
          </p><p>
            &#8212; the completion handler for the asynchronous operation is invoked,
          </p><p>
            whichever comes first.
          </p></div><div class="section" title="10.16.2.6.&#160;Requirements on synchronous write operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.synchronous_write_operations"></a>10.16.2.6.&#160;Requirements on synchronous write operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.sync.write"></a>
<a class="link" href="#buffer.reqmts.sync.write">[buffer.reqmts.sync.write]</a>
<a class="indexterm" name="idm168530438080"></a>
</span>
          </p><p>
            In this Technical Specification, a <span class="emphasis"><em>synchronous write operation</em></span>
            is a function that writes data from a constant buffer sequence argument
            of a type meeting <a class="link" href="#requirements.const_buffers" title="10.16.2.2.&#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="10.16.2.7.&#160;Requirements on asynchronous write operations"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.asynchronous_write_operations"></a>10.16.2.7.&#160;Requirements on asynchronous write operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.async.write"></a>
<a class="link" href="#buffer.reqmts.async.write">[buffer.reqmts.async.write]</a>
<a class="indexterm" name="idm168530430992"></a>
</span>
          </p><p>
            In this Technical Specification, an <span class="emphasis"><em>asynchronous write operation</em></span>
            is an <a class="link" href="#requirements.asynchronous_operations" title="10.13.2.2.&#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="10.16.2.2.&#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 shall ensure the memory remains valid until:
          </p><p>
            &#8212; the last copy of the buffer sequence is destroyed, or
          </p><p>
            &#8212; the completion handler for the asynchronous operation is invoked,
          </p><p>
            whichever comes first.
          </p></div><div class="section" title="10.16.2.8.&#160;Buffer-oriented synchronous read stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.sync_read_stream"></a>10.16.2.8.&#160;Buffer-oriented synchronous read stream requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.syncreadstream"></a>
<a class="link" href="#buffer.reqmts.syncreadstream">[buffer.reqmts.syncreadstream]</a>
<a class="indexterm" name="idm168530420432"></a>
</span>
          </p><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="10.16.2.1.&#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;13.&#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><br>
                      <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="10.16.2.4.&#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 <code class="computeroutput"><span class="keyword">true</span></code>. 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 <code class="computeroutput"><span class="keyword">true</span></code>. 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="10.16.2.9.&#160;Buffer-oriented asynchronous read stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.async_read_stream"></a>10.16.2.9.&#160;Buffer-oriented asynchronous read stream requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.asyncreadstream"></a>
<a class="link" href="#buffer.reqmts.asyncreadstream">[buffer.reqmts.asyncreadstream]</a>
<a class="indexterm" name="idm168530370800"></a>
</span>
          </p><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="10.16.2.1.&#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;14.&#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="10.13.2.3.&#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="10.13.2.2.&#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="10.16.2.5.&#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 <code class="computeroutput"><span class="keyword">true</span></code>.
                      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 <code class="computeroutput"><span class="keyword">true</span></code>. 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="10.16.2.10.&#160;Buffer-oriented synchronous write stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.sync_write_stream"></a>10.16.2.10.&#160;Buffer-oriented synchronous write stream requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.syncwritestream"></a>
<a class="link" href="#buffer.reqmts.syncwritestream">[buffer.reqmts.syncwritestream]</a>
<a class="indexterm" name="idm168530310544"></a>
</span>
          </p><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="10.16.2.2.&#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;15.&#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><br>
                      <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="10.16.2.6.&#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 <code class="computeroutput"><span class="keyword">true</span></code>. 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 <code class="computeroutput"><span class="keyword">true</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">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="10.16.2.11.&#160;Buffer-oriented asynchronous write stream requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.async_write_stream"></a>10.16.2.11.&#160;Buffer-oriented asynchronous write stream requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.reqmts.asyncwritestream"></a>
<a class="link" href="#buffer.reqmts.asyncwritestream">[buffer.reqmts.asyncwritestream]</a>
<a class="indexterm" name="idm168530265616"></a>
</span>
          </p><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="10.16.2.2.&#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;16.&#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="10.13.2.3.&#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="10.13.2.2.&#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="10.16.2.7.&#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 <code class="computeroutput"><span class="keyword">true</span></code>.
                      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 <code class="computeroutput"><span class="keyword">true</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">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="10.16.3.&#160;Class mutable_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.mutable_buffer"></a>10.16.3.&#160;Class <code class="literal">mutable_buffer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.mutable"></a>
<a class="link" href="#buffer.mutable">[buffer.mutable]</a>
<a class="indexterm" name="idm168541251504"></a>
</span>
        </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="10.16.3.1.&#160;mutable_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffer__constructors"></a>10.16.3.1.&#160;<code class="literal">mutable_buffer</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.mutable.cons"></a>
<a class="link" href="#buffer.mutable.cons">[buffer.mutable.cons]</a>
<a class="indexterm" name="idm168529669248"></a>
</span>
          </p><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="10.16.4.&#160;Class const_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.const_buffer"></a>10.16.4.&#160;Class <code class="literal">const_buffer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.const"></a>
<a class="link" href="#buffer.const">[buffer.const]</a>
<a class="indexterm" name="idm168529642688"></a>
</span>
        </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="10.16.4.1.&#160;const_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffer__constructors"></a>10.16.4.1.&#160;<code class="literal">const_buffer</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.const.cons"></a>
<a class="link" href="#buffer.const.cons">[buffer.const.cons]</a>
<a class="indexterm" name="idm168529604752"></a>
</span>
          </p><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="10.16.5.&#160;Class mutable_buffers_1"><div class="titlepage"><div><div><h4 class="title"><a name="classes.mutable_buffers_1"></a>10.16.5.&#160;Class <code class="literal">mutable_buffers_1</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.mutable.1"></a>
<a class="link" href="#buffer.mutable.1">[buffer.mutable.1]</a>
<a class="indexterm" name="idm168529565104"></a>
</span>
        </p><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="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="10.16.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>
          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="10.16.2.1.&#160;Mutable buffer sequence requirements"><code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code></a>.
        </p><div class="section" title="10.16.5.1.&#160;mutable_buffers_1 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffers_1__constructors"></a>10.16.5.1.&#160;<code class="literal">mutable_buffers_1</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.mutable.1.cons"></a>
<a class="link" href="#buffer.mutable.1.cons">[buffer.mutable.1.cons]</a>
<a class="indexterm" name="idm168529504848"></a>
</span>
          </p><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="10.16.5.2.&#160;mutable_buffers_1 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__mutable_buffers_1__members"></a>10.16.5.2.&#160;<code class="literal">mutable_buffers_1</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.mutable.1.members"></a>
<a class="link" href="#buffer.mutable.1.members">[buffer.mutable.1.members]</a>
<a class="indexterm" name="idm168532454096"></a>
</span>
          </p><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="10.16.6.&#160;Class const_buffers_1"><div class="titlepage"><div><div><h4 class="title"><a name="classes.const_buffers_1"></a>10.16.6.&#160;Class <code class="literal">const_buffers_1</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.const.1"></a>
<a class="link" href="#buffer.const.1">[buffer.const.1]</a>
<a class="indexterm" name="idm168532437152"></a>
</span>
        </p><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><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>
          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="10.16.2.2.&#160;Constant buffer sequence requirements"><code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code></a>.
        </p><div class="section" title="10.16.6.1.&#160;const_buffers_1 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffers_1__constructors"></a>10.16.6.1.&#160;<code class="literal">const_buffers_1</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.const.1.cons"></a>
<a class="link" href="#buffer.const.1.cons">[buffer.const.1.cons]</a>
<a class="indexterm" name="idm168530223008"></a>
</span>
          </p><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="10.16.6.2.&#160;const_buffers_1 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__const_buffers_1__members"></a>10.16.6.2.&#160;<code class="literal">const_buffers_1</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.const.1.members"></a>
<a class="link" href="#buffer.const.1.members">[buffer.const.1.members]</a>
<a class="indexterm" name="idm168530193184"></a>
</span>
          </p><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="10.16.7.&#160;Buffer type traits"><div class="titlepage"><div><div><h4 class="title"><a name="classes.buffer_type_traits"></a>10.16.7.&#160;Buffer type traits</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.traits"></a>
<a class="link" href="#buffer.traits">[buffer.traits]</a>
<a class="indexterm" name="idm168530176720"></a>
</span>
        </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">&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</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;17.&#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 syntactic
                    requirements for <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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 syntactic
                    requirements for <a class="link" href="#requirements.const_buffers" title="10.16.2.2.&#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</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">T</span></code> meets the syntactic
                    requirements for <a class="link" href="#requirements.dynamic_buffers" title="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
                    buffer</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="10.16.8.&#160;Function buffer_cast"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_cast"></a>10.16.8.&#160;Function <code class="literal">buffer_cast</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.cast"></a>
<a class="link" href="#buffer.cast">[buffer.cast]</a>
<a class="indexterm" name="idm168530115072"></a>
</span>
        </p><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="10.16.9.&#160;Function buffer_size"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_size"></a>10.16.9.&#160;Function <code class="literal">buffer_size</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.size"></a>
<a class="link" href="#buffer.size">[buffer.size]</a>
<a class="indexterm" name="idm168530086816"></a>
</span>
        </p><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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.10.&#160;Function buffer_copy"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_copy"></a>10.16.10.&#160;Function <code class="literal">buffer_copy</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.copy"></a>
<a class="link" href="#buffer.copy">[buffer.copy]</a>
<a class="indexterm" name="idm168529470336"></a>
</span>
        </p><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">size_t</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 always
            fills 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
            always copies 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 <code class="computeroutput"><span class="keyword">true</span></code>.
            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 <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.11.&#160;Buffer arithmetic"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer_arithmetic"></a>10.16.11.&#160;Buffer arithmetic</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.arithmetic"></a>
<a class="link" href="#buffer.arithmetic">[buffer.arithmetic]</a>
<a class="indexterm" name="idm168529335552"></a>
</span>
        </p><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="10.16.12.&#160;Buffer creation functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.buffer"></a>10.16.12.&#160;Buffer creation functions</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.creation"></a>
<a class="link" href="#buffer.creation">[buffer.creation]</a>
<a class="indexterm" name="idm168529191424"></a>
</span>
        </p><p>
          In the functions below, <code class="computeroutput"><span class="identifier">T</span></code>
          must be a trivially copyable type.
        </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="special">!</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">empty</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="special">!</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">empty</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="special">!</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">empty</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="special">!</span><span class="identifier">vec</span><span class="special">.</span><span class="identifier">empty</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="special">!</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">empty</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="special">!</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">empty</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">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string_view</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">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">&gt;</span>
  <span class="identifier">const_buffers_1</span> <span class="identifier">buffer</span><span class="special">(</span><span class="identifier">basic_string_view</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">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="10.16.13.&#160;Class template dynamic_vector_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.dynamic_vector_buffer"></a>10.16.13.&#160;Class template <code class="literal">dynamic_vector_buffer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.dynamic.vector"></a>
<a class="link" href="#buffer.dynamic.vector">[buffer.dynamic.vector]</a>
<a class="indexterm" name="idm168528583296"></a>
</span>
        </p><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="10.16.2.3.&#160;Dynamic buffer requirements"><code class="computeroutput"><span class="identifier">DynamicBuffer</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 trivially copyable type 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="10.16.13.1.&#160;dynamic_vector_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_vector_buffer__constructors"></a>10.16.13.1.&#160;<code class="literal">dynamic_vector_buffer</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.dynamic.vector.cons"></a>
<a class="link" href="#buffer.dynamic.vector.cons">[buffer.dynamic.vector.cons]</a>
<a class="indexterm" name="idm168528490112"></a>
</span>
          </p><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> Initializes <code class="computeroutput"><span class="identifier">vec_</span></code>
              with <code class="computeroutput"><span class="identifier">vec</span></code>, <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 <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> Initializes <code class="computeroutput"><span class="identifier">vec_</span></code>
              with <code class="computeroutput"><span class="identifier">vec</span></code>, <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 <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="10.16.13.2.&#160;dynamic_vector_buffer members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_vector_buffer__members"></a>10.16.13.2.&#160;<code class="literal">dynamic_vector_buffer</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.dynamic.vector.members"></a>
<a class="link" href="#buffer.dynamic.vector.members">[buffer.dynamic.vector.members]</a>
<a class="indexterm" name="idm168528442992"></a>
</span>
          </p><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>Effects:</em></span> Performs <code class="computeroutput"><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> <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></code>
              exceeds <code class="computeroutput"><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="10.16.14.&#160;Class template dynamic_string_buffer"><div class="titlepage"><div><div><h4 class="title"><a name="classes.dynamic_string_buffer"></a>10.16.14.&#160;Class template <code class="literal">dynamic_string_buffer</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.dynamic.string"></a>
<a class="link" href="#buffer.dynamic.string">[buffer.dynamic.string]</a>
<a class="indexterm" name="idm168528345264"></a>
</span>
        </p><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="10.16.2.3.&#160;Dynamic buffer requirements"><code class="computeroutput"><span class="identifier">DynamicBuffer</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="10.16.14.1.&#160;dynamic_string_buffer constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_string_buffer__constructors"></a>10.16.14.1.&#160;<code class="literal">dynamic_string_buffer</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.dynamic.string.cons"></a>
<a class="link" href="#buffer.dynamic.string.cons">[buffer.dynamic.string.cons]</a>
<a class="indexterm" name="idm168528246800"></a>
</span>
          </p><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> Initializes <code class="computeroutput"><span class="identifier">str_</span></code>
              with <code class="computeroutput"><span class="identifier">str</span></code>, <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 <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> Initializes <code class="computeroutput"><span class="identifier">str_</span></code>
              with <code class="computeroutput"><span class="identifier">str</span></code>, <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 <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="10.16.14.2.&#160;dynamic_string_buffer members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__dynamic_string_buffer__members"></a>10.16.14.2.&#160;<code class="literal">dynamic_string_buffer</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="buffer.dynamic.string.members"></a>
<a class="link" href="#buffer.dynamic.string.members">[buffer.dynamic.string.members]</a>
<a class="indexterm" name="idm168528197328"></a>
</span>
          </p><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>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></code>
              exceeds <code class="computeroutput"><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="10.16.15.&#160;Dynamic buffer creation functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.dynamic_buffer"></a>10.16.15.&#160;Dynamic buffer creation functions</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.dynamic.creation"></a>
<a class="link" href="#buffer.dynamic.creation">[buffer.dynamic.creation]</a>
<a class="indexterm" name="idm168528103904"></a>
</span>
        </p><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>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>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>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>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="10.16.16.&#160;Class transfer_all"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_all"></a>10.16.16.&#160;Class <code class="literal">transfer_all</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.transfer.all"></a>
<a class="link" href="#buffer.transfer.all">[buffer.transfer.all]</a>
<a class="indexterm" name="idm168527998720"></a>
</span>
        </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">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="10.16.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="10.16.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="10.16.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="10.16.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="10.16.17.&#160;Class transfer_at_least"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_at_least"></a>10.16.17.&#160;Class <code class="literal">transfer_at_least</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.transfer.at.least"></a>
<a class="link" href="#buffer.transfer.at.least">[buffer.transfer.at.least]</a>
<a class="indexterm" name="idm168527958912"></a>
</span>
        </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">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="10.16.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="10.16.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="10.16.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="10.16.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="10.16.18.&#160;Class transfer_exactly"><div class="titlepage"><div><div><h4 class="title"><a name="classes.transfer_exactly"></a>10.16.18.&#160;Class <code class="literal">transfer_exactly</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.transfer.exactly"></a>
<a class="link" href="#buffer.transfer.exactly">[buffer.transfer.exactly]</a>
<a class="indexterm" name="idm168527900544"></a>
</span>
        </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">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="10.16.19.&#160;Synchronous read operations">synchronous read</a>, <a class="link" href="#functions.async_read" title="10.16.20.&#160;Asynchronous read operations">asynchronous read</a>, <a class="link" href="#functions.write" title="10.16.21.&#160;Synchronous write operations">synchronous
          write</a>, or <a class="link" href="#functions.async_write" title="10.16.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="10.16.19.&#160;Synchronous read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.read"></a>10.16.19.&#160;Synchronous read operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.read"></a>
<a class="link" href="#buffer.read">[buffer.read]</a>
<a class="indexterm" name="idm168527836640"></a>
</span>
        </p><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="10.16.2.4.&#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> Clears <code class="computeroutput"><span class="identifier">ec</span></code>,
            then reads data from the <a class="link" href="#requirements.sync_read_stream" title="10.16.2.8.&#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 <code class="computeroutput"><span class="keyword">true</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">SyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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> Clears <code class="computeroutput"><span class="identifier">ec</span></code>,
            then reads data from the <a class="link" href="#requirements.sync_read_stream" title="10.16.2.8.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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 less than or equal to <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">b</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</span><span class="special">&lt;</span><span class="identifier">DynamicBuffer</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.20.&#160;Asynchronous read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_read"></a>10.16.20.&#160;Asynchronous read operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.async.read"></a>
<a class="link" href="#buffer.async.read">[buffer.async.read]</a>
<a class="indexterm" name="idm168533641360"></a>
</span>
        </p><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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.16.2.5.&#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> Reads data from the <a class="link" href="#requirements.async_read_stream" title="10.16.2.9.&#160;Buffer-oriented asynchronous read stream requirements">buffer-oriented
            asynchronous read stream</a> object <code class="computeroutput"><span class="identifier">stream</span></code>
            by invoking the stream's <code class="computeroutput"><span class="identifier">async_read_some</span></code>
            member function (henceforth referred to as asynchronous read_some operations)
            zero or more times.
          </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>
            This asynchronous read operation is outstanding 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 shall 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 <code class="computeroutput"><span class="keyword">true</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">AsyncReadStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBuffer</span><span class="special">,</span>
  <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
    <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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="10.13.2.2.&#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="10.16.2.9.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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></code> is
            less than or equal to <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">b</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 is outstanding 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 <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</span><span class="special">&lt;</span><span class="identifier">DynamicBuffer</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.21.&#160;Synchronous write operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.write"></a>10.16.21.&#160;Synchronous write operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.write"></a>
<a class="link" href="#buffer.write">[buffer.write]</a>
<a class="indexterm" name="idm168533467568"></a>
</span>
        </p><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="10.16.2.6.&#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="10.16.2.10.&#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 <code class="computeroutput"><span class="keyword">true</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">SyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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="10.16.2.10.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.const_buffers" title="10.16.2.2.&#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</span><span class="special">&lt;</span><span class="identifier">DynamicBuffer</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.22.&#160;Asynchronous write operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_write"></a>10.16.22.&#160;Asynchronous write operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.async.write"></a>
<a class="link" href="#buffer.async.write">[buffer.async.write]</a>
<a class="indexterm" name="idm168533276880"></a>
</span>
        </p><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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.16.2.7.&#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="10.16.2.11.&#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 <code class="computeroutput"><span class="keyword">true</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">AsyncWriteStream</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</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="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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="10.13.2.2.&#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="10.16.2.11.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</a> object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.const_buffers" title="10.16.2.2.&#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 <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</span><span class="special">&lt;</span><span class="identifier">DynamicBuffer</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
            is <code class="computeroutput"><span class="keyword">true</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.23.&#160;Synchronous delimited read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.read_until"></a>10.16.23.&#160;Synchronous delimited read operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.read.until"></a>
<a class="link" href="#buffer.read.until">[buffer.read.until]</a>
<a class="indexterm" name="idm168533118784"></a>
</span>
        </p><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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">string_view</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">DynamicBuffer</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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span>
                    <span class="identifier">string_view</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="10.16.2.8.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</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 object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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 <code class="computeroutput"><span class="keyword">true</span></code>. 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. [<span class="emphasis"><em>Note:</em></span> On completion,
            the buffer may contain additional bytes following the delimiter. &#8212;<span class="emphasis"><em>end
            note</em></span>] Otherwise returns <code class="computeroutput"><span class="number">0</span></code>.
          </p></blockquote></div></div><div class="section" title="10.16.24.&#160;Asynchronous delimited read operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_read_until"></a>10.16.24.&#160;Asynchronous delimited read operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="buffer.async.read.until"></a>
<a class="link" href="#buffer.async.read.until">[buffer.async.read.until]</a>
<a class="indexterm" name="idm168532366928"></a>
</span>
        </p><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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</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">DynamicBuffer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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">DynamicBuffer</span><span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">string_view</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="10.13.2.2.&#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="10.16.2.9.&#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="10.16.2.3.&#160;Dynamic buffer requirements">dynamic
            buffer</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 object <code class="computeroutput"><span class="identifier">b</span></code>.
            A <a class="link" href="#requirements.mutable_buffers" title="10.16.2.1.&#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 <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>
            If <code class="computeroutput"><span class="identifier">delim</span></code> is of type
            <code class="computeroutput"><span class="identifier">string_view</span></code>, the implementation
            copies the underlying sequence of characters prior to initiating an asynchronous
            read_some operation on the stream. [<span class="emphasis"><em>Note:</em></span> This means
            that the caller is not required to guarantee the validity of the delimiter
            string after the call to <code class="computeroutput"><span class="identifier">async_read_until</span></code>
            returns. &#8212;<span class="emphasis"><em>end note</em></span>]
          </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 <code class="computeroutput"><span class="keyword">true</span></code>. 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="10.17.&#160;Sockets"><div class="titlepage"><div><div><h3 class="title"><a name="network.sockets"></a>10.17.&#160;Sockets</h3></div></div></div><p>
        <span class="xrefid">
<a name="socket"></a>
<a class="link" href="#socket">[socket]</a>
<a class="indexterm" name="idm168532244304"></a>
</span>

      </p><div class="section" title="10.17.1.&#160;Header &lt;experimental/socket&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_socket___synopsis"></a>10.17.1.&#160;Header <code class="literal">&lt;experimental/socket&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.synop"></a>
<a class="link" href="#socket.synop">[socket.synop]</a>
<a class="indexterm" name="idm168532239376"></a>
</span>
        </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">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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.18.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="10.18.2.&#160;Class template basic_socket_iostream">basic_socket_iostream</a><span class="special">;</span>

      // <a class="link" href="#functions.connect" title="10.19.1.&#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">EndpointSequence</span><span class="special">&gt;</span>
        <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">EndpointSequence</span><span class="special">&gt;</span>
        <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">EndpointSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">EndpointSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
        <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">&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">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="10.19.2.&#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">EndpointSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">EndpointSequence</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="emphasis"><em>DEDUCED</em></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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">CompletionToken</span><span class="special">&gt;</span>
        <span class="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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><p>
          The figure below illustrates relationships between various types described
          in this Technical Specification. A solid line from <span class="bold"><strong>A</strong></span>
          to <span class="bold"><strong>B</strong></span> that is terminated by an open arrow
          indicates that <span class="bold"><strong>A</strong></span> is derived from <span class="bold"><strong>B</strong></span>. A solid line from <span class="bold"><strong>A</strong></span>
          to <span class="bold"><strong>B</strong></span> that starts with a diamond and is
          terminated by a solid arrow indicates that <span class="bold"><strong>A</strong></span>
          contains an object of type <span class="bold"><strong>B</strong></span>. A dotted
          line from <span class="bold"><strong>A</strong></span> to <span class="bold"><strong>B</strong></span>
          indicates that <span class="bold"><strong>A</strong></span> is a typedef for the
          class template <span class="bold"><strong>B</strong></span> with the specified template
          argument.
        </p><p>
          <span class="inlinemediaobject"><img style="width:60%;" src="data:image/png;base64,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t2YJxniQoRntgiPWr+LFgu2F9Wyf5ySQsATiJTsU9SQBEiABEiABEiABEvBPID1ZgpGV1yT20cyz5oeuHs0aTMsYW6my7xrPooWMuXa9EiVKWCY01a8yxuNo1a9fXzPd2vWN19AyCYic+naWYKfAnNj7qbZq1coyHlLnlkn6ZJmtcizjlXT6RxbdPn36OHXsE/Rhkkd51a1Vq5Z92/UR+6DeddddlgmJdvrEPqgDBgywkAHYU8w6X8sY+E49sMG+tbfddpuW23VD4Y3xm217rAIFCjjtgqUxVC2T2MluMuiRWYKDImKFOCCQAh3NPwAKCZAACZAACZAACZBAnBI4cuSIJvtBEiXPcNVgw8HPQKy7RDZbYwRqRl4kDAok6AfPwCMbTJAcCG3DIwqv7MUKQnHNtjLaljHkvLIZ+7aNRFHoG2Nyo6vv857XCIVGiLGnJ9nzvn1+7Ngxze7rmVXYvmcfQ+WN55C86fjx4zqOYDrY/djHuXPnitlaR06cOKHJrexyHkkgnggwJDieZou6kgAJkAAJkAAJkEAYCcA4LVy4sOsWkQDJrSArLpI2hUuQMdfss+qqOWzBE66wWRjbbgxuGObBJFTeaA/GOT4UEkhWAjRYk3XmOW4SIAESIAESIAESSCICJjxWsxIHGzKyHvfr1y9YNd4nARKIEAEarBECzW5IgARIgARIgARIgASiRwBZe3/44YegCvjufRr0AVYgARLIUAI0WDMULxsnARIgARIgARIgARKIBQImGZPgQyEBEogvAtyHNb7mi9qSAAmQAAmQAAmQAAmQAAmQQNIQoMGaNFPNgZIACZAACZAACZAACZAACZBAfBGgwRpf80VtSYAESIAESIAESIAESIAESCBpCNBgTZqp5kBJgARIgARIgARIgARIgARIIL4I0GCNr/mitiRAAiRAAiRAAiRAAiRAAiSQNARosCbNVHOgJEACJEACJEACJEACJEACJBBfBGiwxtd8UVsSIAESIAESIAESIAESIAESSBoCNFiTZqo5UBIgARIgARIgARIgARIgARKILwI0WONrvqgtCZAACZAACZAACZAACZAACSQNARqsSTPVHCgJkAAJkAAJkAAJkAAJkAAJxBcBGqzxNV/UlgRIgARIgARIgARIgARIgASShgAN1qSZag6UBEiABEiABEiABEiABEiABOKLAA3W+JovaksCJEACJEACJEACJEACJEACSUMgS9KMlAMlARIgARIgARIggQQnMHr0aJk6dWpURnnhwgX59ddf9VOhQgXJli1bVPQI1unRo0clb968kjlz5mBV4/7+vn374n4MHAAJ0GDld4AESIAESIAESIAE4pwADLBOnToJjLFIGimnTp2SQ4cOyeHDh/Vz/vx5SUlJUWM1V65cMUl10aJFcsUVV0iVKlViUr9wK9W1a1fJmTNnuJtleyQQMQIplpGI9caOSIAESIAESIAESIAE4pbAiRMnZPHixTJ//nyZN2+e7Ny5U3Lnzi2NGjWSfPnyyeTJk2XkyJHy2GOPxewYs2TJIjCs//3vf0vPnj1jVk8qRgIk8P8EaLDym0ACJEACJEACJEACJOCXAMJ816xZ4xioK1euVGOvevXq0rx5c2nWrJnUrVtXzpw5IygrXbq0GrLwssainDt3TrJmzSrXXXedbN++XVatWiWVKlWKRVWpEwmQwH8J0GDlV4EESIAESIAESIAESCAVgQkTJsjgwYM11Ldo0aJqnMJAbdq0qRQoUMCrfvfu3dVQXb9+vRQuXNjrXixd/PHHH5InTx757LPPZMSIEXLs2DFZvXo1Q2ZjaZKoCwn4EOAaVh8gvCQBEiABEiABEiABEhDJnj27GquvvfaaPPDAAwGRvPPOO/Lee+/J7NmzY9pYxQDgCYbAaP3ggw+katWq0rt3b5k0aZKW8z8kQAKxR4Db2sTenFAjEiABEiABEiABEog6gTvvvFPatWsno0aNkuPHj/vVZ8eOHWrw9evXT1q2bOm3TiwVnj59WtWBMV68eHFdc4t1t1OmTIklNakLCZCABwEarB4weEoCJEACJEACJEACJPA/Am+++abAyOvbt+//Cv979tdff0nnzp2lXLlyGl6bqkIMFtgeVhiskNatW8vDDz+sHuQtW7bEoMZUiQRIgAYrvwMkQAIkQAIkQAIkQAJ+CWD7Fxh0b7/9tkyfPt2rzhNPPCE//PCD7vt6ySWXeN2L1QtfgxV6vvDCC3LttddKhw4d1DiPVd2pFwkkKwEarMk68xw3CZAACZAACZAACaRBAHusPvjggzJo0CBp3Lix3HfffXLw4EF9AlvajB49WsaNGyfly5dPo5XYumUbrDly5HAUQ9bgDz/8UPbv3y8PPfSQU84TEiCB2CBAgzU25oFakAAJkAAJkAAJkEDMEMB2L9WqVZP3339fPzNmzND9Vnv16qVGK9a3durUSf7+97/HjM5uFLENVjsk2H6mZMmS8tZbb8nEiRN1vHY5jyRAAtEnQIM1+nNADUiABEiABEiABEggJghgn9Jhw4ZJvXr1BEbchg0bdJ0qsuoiOdGcOXPkhhtukFy5csn48eNjQudQlAhksKKNv/3tb7pWF57kbdu2hdIs65IACWQgARqsGQiXTZMACZAACZAACZBAvBBA0qE6depoVuAxY8bovqpXXnmlo36DBg3k0UcflZ9//lm9kHnz5nXuxcuJZ5ZgX523bt0q+fPnl5MnT2ootO99XpMACUSHAPdhjQ539koCJEACJEACJEACMUHAsixdizpw4ECpVKmSrFu3TipUqOBXt+HDh8u9994rZcuW9Xs/1gvhYU1JSZFs2bIJxv3tt99qMimEPCOBVIECBTTMGaHPFBIggdggQIM1NuaBWpAACZAACZAACZBAxAkg0dBdd90lS5YskcGDB8uTTz4pWbIE/nmYOXPmuDVWARcGK8aAZFIwUjF+eFWrVKmiIc4IhcZ9CgmQQOwQYEhw7MwFNSEBEiABEiABEiCBiBGYOnWqVK5cWXbv3i1fffWVrl1Ny1iNmGIZ2BGMUazTXb58ucCLCm8yDPZ9+/ZJw4YNaaxmIHs2TQLpJZBiwiGs9D7M50iABEiABEiABEiABOKLwNGjR+Uf//iHbuXSu3dvXbOaM2fO+BpEOrW9cOGCZjkuUqSI08KKFSs0ydTGjRs1JNq5wRMSIIGYIBA45iMm1KMSJEACJEACJEACJEAC4SIwf/589SiiPeyl2qxZs3A1HRftZMqUSTyNVShdu3ZtKVSokIYIYw0vhQRIILYIMCQ4tuaD2pAACZAACZAACZBA2AmcOnVK1202b95ckO0X3sRkM1YDQYUR265dO02+FKgOy0mABKJHgAZr9NizZxIgARIgARIgARLIcAKrVq2SatWq6VY077//vnzwwQdy+eWXZ3i/8dQB9mBds2aN7N27N57Upq4kkBQEaLAmxTRzkCRAAiRAAiRAAslGAMmFhg0bpuszS5YsKRs2bJDOnTsnGwZX423SpIlgX1lkDqaQAAnEFgEmXYqt+aA2JEACJEACJEACJHDRBLZu3Srdu3fX0N+RI0dqODD2H6UEJtCpUyf57bffZNGiRYEr8Q4JkEDECdDDGnHk7JAESIAESIAESIAEMoYANn8YN26chgDjfO3atdKnTx+hsRqc96233irLli2TI0eOBK/MGiRAAhEjQIM1YqjZEQmQAAmQAAmQAAlkHIH9+/cLkir1799fBgwYICtXrpSKFStmXIcJ1nLLli0FCZhmzZqVYCPjcEggvgnQYI3v+aP2JEACJEACJEACJCBTp06VypUry+7du+Wrr76Sp59+WrJk4e6FoXw1sIYVa1m5jjUUaqxLAhlPgAZrxjNmDyRAAiRAAiRAAiSQIQSOHj2qiZS6dOki+Kxbt05q1aqVIX0lQ6PIFoz9aU+fPp0Mw+UYSSAuCNBgjYtpopIkQAIkQAIkQAIk4E1g/vz56lXFusu5c+fq2tWcOXN6V+JVSATatm0rZ86cEbClkAAJxAYBGqyxMQ/UggRIgARIgARIgARcETh16pRm/W3RooXUr19ft6vB2lXKxRMoXLiw1K5dW6ZPn37xjbEFEiCBsBCgwRoWjGyEBEiABEiABEiABDKewOrVq6V69ery3nvv6eeDDz6QfPnyZXzHSdQDsgUj8dL58+eTaNQcKgnELgEarLE7N9SMBEiABEiABEiABJTAuXPnZNiwYVK3bl0pXry4elU7d+5MOhlAAOtYDx8+rFvcZEDzbJIESCBEAjRYQwTG6iRAAiRAAiRAAiQQSQJbt25VQ3XUqFEyZswYXV9ZrFixSKqQVH1dddVVUqlSJWYLTqpZ52BjmQAN1lieHepGAiRAAiRAAiSQtAQsy9JEStWqVROcr127Vvr06SMpKSlJyyRSA0dYMLe3iRRt9kMCaROgwZo2H94lARIgARIgARIggYgT2L9/vyCRUv/+/WXAgAGycuVKqVixYsT1SNYOERa8Z88efUmQrAw4bhKIFQI0WGNlJqgHCZAACZAACZAACRgCSKRUuXJl2b17t3z11Vfy9NNPS5YsWcgmggRq1KghJUqUYLbgCDJnVyQQiAAN1kBkWE4CJEACJEACJEACESRw9OhRQSIl+7Nu3TqpVatWBDVgV54E2rVrx7BgTyA8J4EoEaDBGiXw7JYESIAESIAESIAEbALz589Xr+qyZctk7ty58tprr0nOnDnt2zxGgQDWsW7cuFF27NgRhd7ZJQmQgE2ABqtNgkcSIAESIAESIAESiDCB06dPayKlFi1aSP369XW7GqxdpUSfQIMGDXSPWyZfiv5cUIPkJkCDNbnnn6MnARIgARIgARKIEoHVq1cLMgC/++67+sHa1Xz58kVJG3brSwDrhtu0acN1rL5geE0CESZAgzXCwNkdCZAACZAACZBAchM4d+6cDBs2TPdWLV68uHpVu3TpktxQYnT0yBb89ddfy8GDB2NUQ6pFAolPgAZr4s8xR0gCJEACJEACJBAjBLZu3aqG6qhRo2TMmDGCtavFihWLEe2ohi8BhGdnz55dZs6c6XuL1yRAAhEiQIM1QqDZDQmQAAmQAAmQQPISsCxLxo0bpyHAOF+7dq2uXU1JSUleKHEw8hw5ckizZs2YLTgO5ooqJi4BGqyJO7ccGQmQAAmQAAmQQAwQ2L9/v8BT179/fxkwYICsXLlSKlasGAOaUQU3BJAteNGiRXLixAk31VmHBEggzARosIYZKJsjARIgARIgARIgAZsAEilVrlxZdu/eLV999ZU8/fTTgmQ+lPgh0Lp1a7lw4YLMmTMnfpSmpiSQQARosCbQZHIoJEACJEACJEACsUHg6NGj0rlzZ+ezbt06qVWrVmwoRy1CIoDMzQ0bNmRYcEjUWJkEwkeABmv4WLIlEiABEiABEiABEpAFCxaoV3XZsmUyd+5cee211yRnzpwkE8cEkC0YHtY///wzjkdB1UkgPgnQYI3PeaPWJEACJEACJEACMUbg9OnTmkgJ61Xr1aun29XgnBL/BGCwHj9+XBYvXhz/g+EISCDOCNBgjbMJo7okQAIkQAIkQAKxR2D16tWaAfjdd98VfD788ENBKCklMQhgv9waNWrI9OnTE2NAHAUJxBEBGqxxNFlUlQRIgARIgARIILYInDt3ThMp1a1bV2DUbNiwQbp06RJbSlKbsBCAl/Wzzz7TBExhaZCNkAAJuCJAg9UVJlYiARIgARIgARIgAW8CW7duFRiqI0eOlNGjR8v8+fOlWLFi3pV4lTAEsL3NgQMH5Ouvv06YMXEgJBAPBJhXPR5miTqSAAmQQJIQ+OWXXwTrACkkEOsE4GkbNGiQlC9fXmbOnClly5aVH3/8MdbVThj9UlJSpGTJkpIpU+R8L5UqVZKrrrpKswXjRQWFBEggMgRSLCOR6Yq9kAAJkAAJkEBgAnv37tUfoPzfUmBGvEMCJPA/AuPGjZPevXv/ryACZ4899piuY92+fXsEemMXJEACIEAPK78HJEACJEACMUHg5MmTAmMVyWrgxaCQAAmQQCACbdu2lRMnTgS6nWHlWMf64osvyqZNmwQeVwoJkEDGE6DBmvGM2QMJkAAJkEAIBK6++mrdwzKER1iVBEggyQhky5YtKiOuXbu2FC5cWL2sNFijMgXsNAkJRC7wPwnhcsgkQAIkQAIkQAIkQAKJQwBrZuHdnTFjRuIMiiMhgRgnQIM1xieI6pEACZAACZAACZAACcQOAWQLXrNmjWDdPYUESCDjCdBgzXjG7IEESIAESIAESIAESCBBCDRu3Fjy5s1LL2uCzCeHEfsEaLDG/hxRQxIgARIgARIgARIggRghcMkll0irVq10HWuMqEQ1SCChCdBgTejp5eBIgARIgARIgARIgATCTQDZgpcvXy5HjhwJd9NsjwRIwIcADVYfILwkARIgARKITwIXLlyIScXt/WVLliyp+8ziuGXLlrDpGqvjfvjhh53xYsz3339/2MacrA1xrmNn5uFhRQKmzz//PHaUoiYkkKAEaLAm6MRyWCRAAiSQTATat28v8HjEolx66aUyYMAA/dSqVUv27Nkjf/3110WrunjxYilevLisWrXqotvKiAbwg94e9+HDh+W3337LiG4yvE3s9VmoUCHnU6JECalbt648++yzgnFFQjjXkaAcWh958uSRJk2acB1raNhYmwTSRYAGa7qw8SESIAESIIFYIrBu3Tr5888/Y0klRxckZ3nwwQf1c+ONNzrlF3uyf/9+2bdv38U2k+bzlmWleT+tmzfffLMz7uzZs6dVNabvwav566+/CvYHfuKJJ6Rbt25y5swZeeqpp9RwjURIaCTm+mImIZS5vpjv1MXomBHPIlvw/Pnz5dSpUxnRPNskARL4L4EsJEECJEACJEAC8Ujg2LFjakhAd3gsT548Kdu2bXOGgsQopUqVcq5xgh/LW7dulV9++UUqVaokBQsW9Lr/888/C56D92TlypVSp04dyZYtm/z0009y+vRpNVrsdrZv3y6FCxfWbKEwWr7//nupUKGCFC1a1KvNUC927dolO3fuVF2vuuoqKVOmjFcTuHf+/Hk5cOCAlsNjmy9fPqcO+s+dO7dzjZPjx4/L2rVrJX/+/FKxYkXJmjWr131/F++//76MGjVK5s2bp95F3zpgjtDmo0ePqqe3dOnSvlVcX2PuNmzYoB7LAgUKyLXXXiu5cuXy+zxeTOzYsUN2796tc4Vw47Jly0pKSopXfbf1vB5K46JatWrSt29frTF8+HB57rnnZMiQITJu3DgZOnSolqNPfFeKFSsmOXPmFHhnv/32W51D6Okr586dkx9++EG9z9dcc41+nzzrpGeu4ckGS3DEXOP7HEjczmEobQbqC+Uw/jt37qzfp5deekkyZ86cVvWYv4f9WBHqDqM1ViM8Yh4iFSQBNwTM/7wpJEACJEACJBB1AuaHO9x51vr1613pMnbsWK2PZ/x9jEHq1Y4xHCxjwGpds/ZMjz179rSMseTUu+2226yHHnrIuummm/S+MVIsY7haxmi1jEFkjR49WuviGfRpjBXrkUce0Xu2DsZ4cdrzPbF19jdGYzxYV155pbZrt4Vjy5YtLePBcZoyRmeqOp71P/74Y6cu2jRGloXx2mNGHwsXLnTq+J4Yo8IaPHiw9tG1a1fLGOpeVdCmMdYs4zX10uPxxx/3qud5AZ3B1p+ASZYsWbzaQv1PPvkkVfXZs2f7ZWQ8kF513dbzeijAhXkxorr169fPq4bxulrG4LLatGnjlG/atEnrmnWN1rBhw5xx4btjjFynHk4++ugj6/LLL/cad8eOHS0TZuzUC2WuDx06ZLVr186rvSuuuML69NNPnfbsE7dzGEqbdttpzTXqYL7BrXnz5hbYplfMixzrhRdeSO/jYXuuXr161p133hm29tgQCZBAagJ4g0shARIgARIggagTCNVgxY9pGH74GI+WZdYVOtcoM55UZ0zGc2oZj53VokULC+cwACdOnKhGnFln6dSDUVWkSBE1rv7zn//oj38YvnPmzLG6d+9uNWjQQOvaBisMAuPds4yHRfuD8QLj0awrddr0PEnLYDXeNmvgwIHWsmXLLOMBtjZu3Gj17t1b2zPhp04zMIowvueff17vvfPOO17j9jQCTOIjNSxhxBrvn2W8wsrJeJAt46F12rRPMC4wgHE7YsQIu9jrCAMYY7z77rstE4ptGQ+vNXfuXGv69Ole9Twv0jJipk2bZk2aNMky3lrLePIsXJt1ojpff/zxh9MMxgW9zbpBy3hYLROWa8FoXLp0qZdB77ae03CQE7SH8foarJhjlOOlhy22wWq8pRYMqgULFljG827dcMMNlvFqW7Zhje8LngVrzKUJ7bZGjhyphtwdd9xhN2eFMtcwnEz4uWU84zq3eNFSvXp1bRPfJU9xO4ehtGm3n9Zc23XA5bLLLrOMB1jn0i4P5RgrBuuLL75omQgHCy8BKCRAAhlDgAZrxnBlqyRAAiRAAiESCNVg9WweP17hsQkk+IEOjyAMIk/p0KGDZUI3LRNiq8UwIEwIpWUy+6pxAaMCdSBm/aJ6xHBuG6wmzNPL8IPxhmfgpfUnaRms/urDu4kf9vCy+sqUKVO0Lxgm/gQGKTzDjz76qNdt26jyNUgxZniUYfTAQ+hPMEcwZuEJDEXcGDGe7cFzBo7ffPONU2x/PzAPaYnbemm14XnPn8GKlyW333676gjjyxabLb4XeDFiCzzxGI8Jr9aimjVrWqiDlxSe0qtXL60Hg9xTgs31rFmz9Dm8hPGUH3/8UQ1lvGyxxe0chtKm3TaObucaL5TKly+vxt6SJUs8m3B1HisGK14CYW5NYixXerMSCZBA6AS4htX8laGQAAmQAAkkNoEVK1bousLVq1d7DRTr+5Awxd56BjexVhFrEO01ovbaNGOo6dpRzwaMMeu1vhNZe5FR1hgKntVCOse6RayzxbpB8791XQtpPI0htYHKa9askbNnz+pa0C+++MJ5HusIsd7Tc2sdZBrGOLHuEmt3sZ7Sn4Ajnr/vvvv83U53GZIYYa0nkkjhHOtyIZ7jNsaNGI+hGENbsH64R48eYl5SpFqP67ZeqMoaL7tgjTN0Ay98H5555hlBwiFfMS9IxHjqnWJj3IrxxusaaKxzRZKwBx54INUazltuuUWM0SmbN2/WdblOA0FOjGGvNZAEyFOwhhtzaQxpp9jtHIbSptN4CCeYJ/RhXn5Is2bN5LXXXpN77rknhBZioyrWmWPNtYkwkEaNGsWGUtSCBBKMAA3WBJtQDocESIAESCA1AWRZRabXLl26pLppPJheWT59k/f4XqdqwKcgR44cmqDJpzjoJQznTp066b6OSAZlPFVqWBpvXkjGi90Rxgwx627FrBG1i/WIrXZgeNoCwxCGIsrTStIDYxpivIP2oxd9NGssNXENEkPhRQGSXOHcV2AgmrW3aiQaj6OYMGdl1L9/fxk0aJBj/Lmt59t+sGvwMd5WQXIpGJZmvahUrlzZ72PQwVOQnAuGGQTJopA0Cwasr9hJwPCyIhTBCxckMDJrYlM9hjY9X064ncNQ2kzVqcsCZI+GfuABtvEqeNmD7+Srr74ar0Og3iQQ0wS8/6LGtKpUjgRIgARIgAQCE4A3MpAgcy4y6cIQQFZb3w+2LAmHwAiEFw7ZgkMVeOtMKK4aYgcPHlQvGzxj8OCkJYHGbWcrNmtdU40X4588ebLTbOPGjdXbhbbMekvBvp/+xCRs0mLbGPZXJ5Qy6GESO2k2W2RuRvZfjHnMmDF+m4FBhuyy8H6bkFU1GJ988kl55ZVXvOq7ref1UJALEy6uGZORPRl9BjJWgzSjnlcYtP4Y2mXIeuxPAs015gVGH743voI2PdtzO4ehtOnbp5trzDe2eZo5c6Z6J7Fnb7wKPNvwvCOqgUICJBB+AjRYw8+ULZIACZAACUSYALxVCPdFuKU/QSgpPKzYoiUjxWR+VR3Ss98q9Ieh1b59e0dFhBYH8rbZHrovv/zSqe95UqVKFfWsmqRMnsUBz8uVKydff/21ht0i1Hb8+PGp6pq1l1o2YcKEVPfSU2CSAalnFyGznt5B39Bt37axLQ+8nCYbsHoWEaLrT9zW8/dsRpXBg40QUhhq2CrJU+Clg8e/atWqnsWONzbQXNeoUUPrT5061es5GFAIL/YMVXU7h6G06dWpiwuEf0MPGNhfffWVYHuYeBb8fTGJwmTGjBnxPAzqTgIxS8A7Rihm1aRiJEACJEACJBCYAH6QYz1ct27d1GOHPTzN9iBiMq7qQ2bLFfUomoyugnWnMJBgGCDs0WT31OvArQe+g/WA8PTBeISxB88bvJXowxaEYGKPVsh3332nR4S2Yh0mQiJbtWqlZVjTB88mvIsmO6uY7LeC/T6hnz+BQYH9Yl9++WVd61q7dm01AGCowsOL9bQmk6/AuAQfhKSi3d9//11DRGHw2V5Yu30wwXpXkxFX/vGPf6i3Ex5NO6S4Vq1a2g68jAiRRQgzwohNIh9BKPS9995rN6Vc7BcIOMLTh/BfCNYJI7TWJM7RtmGowYBB+PPrr78uy5cvd9qxT2DkmOQ8gvEhXBpeVrP1jXoWTfZmu5quhXVTz3kgCifYwxVGWtOmTTWcGezAAN8leIvB1FOCzTVCUlEH33OsW27YsKGugzYJqvR7YLZecppzO4ehtAm9g821rQCMavw7hJGHdZ92GLR9P16P4IXxPPvss/E6BOpNArFLwISXUEiABEiABEgg6gTs7K7Y5iNUwfYnJgmPZkQ1/8fVrJ3mh7lXM9iCpU6dOl51kEW3T58+Tj1kCTaGn15jaxm0hW1CIMYY1Qy6OLezBCOjsN2fWadoPfbYY15brKCuMUCcOnZd+4hnbEF/2DbHvoetXbBXJ3Syt9Ox69pH7DeKbXXsZ7C/pWeGX2NE6H6gBQoUcOqgrjFUvbb9sdvzPJokOLo1C7Zc8RRjqFrYZge62/0aA0v3pPWsZzymzn27nn003lunKs5z586tdTEfyECMjKuou2jRIqcethbC1kR2GzgaY0f3N7WzPKOy23pOw0FO/GUJDvSInSXYvEQIVMUpx1ZDyBRsjwfzbcK0nfu+J8Hm2njiLWyJA4ZoE1mxsS8rvle+4nYO3bbpdq4xT8h4jazF0OFiJFayBNtjsL+zyBpMIQESCC+BFDRn/rBRSIAESIAESCCqBJAYBmtJjcGa7vWB9jo+JO6BF86fmK1EdL0ZvFrGkEuVZdbfM75lSJAEL67ZMkaGDBmiCYzgnQyHIPkMvGTINuxWkKQIiZMwZozdn8B7iXqo4+vB81cfZfDuIqw2kMBbizpYH+ybaCjQM/7KMW/wwCKzblr94ScLwkgxVowTSZr8JcVyW8+fLpEuO3LkiHrIA31fffUJNtc2S6xBRSKmYOJmDkNtM60+g32n0nrW8x7W5SKrMBJuxYKAEf7Nmr2UJZ7X48YCS+pAAr4EGBLsS4TXJEACJEACcUsAP9B9w1x9B4PwVoSihkvMvqXhakrbSY/hCx2C6QHjHJ9QJC3jEe24NXyD9Yl5wxrAYALjFBl3g4nbesHaicR9GPuhSLC5dsvS7tPNHIbapt22v2Ow75S/Z+KhDIxat26t61hpsMbDjFHHeCLApEvxNFvUlQRIgARIgARIgARIICYJIFsw1rLbezjHpJJUigTikAAN1jicNKpMAiRAAiQQXQLwpjRp0kSQWZdCAiRAAiDQrFkzTaT22WefEQgJkEAYCdBgDSNMNkUCJEACJJAcBLB+Epl+PbPiJsfIOUoSIIFABLAuHltCIVswhQRIIHwEaLCGjyVbIgESIAESIAESIAESSGIC2N4G21MhORaFBEggPARosIaHI1shARIgARIgARIgARJIcgJIvHThwgXdzzjJUXD4JBA2AjRYw4aSDZEACZAACZAACZAACSQzAWR9btiwIcOCk/lLwLGHnQAN1rAjZYMkQAIkQAIkQAIkQALJSgDZgufMmSN//vlnsiLguEkgrARosIYVJxsjARIgARIggYwlcPr0aSlZsqQMHz48YztKo3WEPDZu3Fj1+PHHH9OomRi3kBG6c+fOGTIYsKQkFoF27drJiRMnZNGiRYk1MI6GBKJEgAZrlMCzWxIgARIgARJIDwHLsmTPnj1y9OjR9Dwelmf++OMPWb58ueqxcePGsLQZy438/PPPcvDgwbCr2L59e0GSHkpiEShevLjUrFlTZsyYkVgD42hIIEoEaLBGCTy7JQESIAESIIF4JZA3b16ZNWuWTJgwQW655ZZ4HUbU9V63bh3DRqM+CxmjAF5EzJw5UxMwZUwPbJUEkodAluQZKkdKAiRAAiRAAolDICUlRQcDT+t3330nFSpUkKJFi6Ya4MmTJ2XDhg1y+PBhKVCggFx77bWSK1euVPVQgDV3O3bskN27d8sll1yiIb9ly5YVu6+//vpL7BDg0qVLCz7nzp3Tun4b/G/hr7/+Klu2bJGcOXNKpUqVBPtVpleC6Wi3C71++OEH+e233+Saa66RwoUL27f8HkPV8cyZM+phzpo1q3LwbBRe8K1bt8ovv/yi4y1YsKBz+9ixY4K+IOCJ+dm2bZtzH9xLlSrlXPMkPgnAYH3yySfl66+/lrp168bnIKg1CcQKAfNHlUICJEACJEACUSdgjAvL/L/RWr9+fdR1iWUFjIGjnMyPYeuRRx6xjDGp12A3dOhQL9XHjh1rZcmSxbmPOvnz57c++eQTr3q4mD17tnXllVd61UX9/fv3O3V37dqV6n5a82UMZev666/3eiZbtmzW77//7rQZyokbHdHeRx99ZF1++eVe/Xbs2NEyRnuq7tzoWLFiRatRo0bOs6dOndJrY1xa06dPd8px8u2331rG4NS+M2XKpMeePXtamDcI5gRcA32MQa/1+J+0CZQpU8Z64YUX0q4U5bvlypWzHn300Shrwe5JIP4JMCTY/B+DQgIkQAIkQALxRuD111/XNXLz5s1Tb16bNm3kmWeekdWrVztDgcf1zTffVO8mPI3Tpk1T7+qdd96pnj27ojEgpVOnTmIMM/WwwnsIL+DSpUvFGH52NSlWrJhs3rxZP4MHD3bK/Z3s3btX6tSpI1j/+eGHH6o3Ep7e559/XjJnzuzvkTTL3Oq4YMECMcapGANTjDEt+/btk5EjR+rYH3jgAa8+0qMj2LRt21ZWrFihbXquQYVH9cYbb1SOGDfW+k6cOFHefvttGTZsmPaN5E3QCx/whPfNvsbx008/9dKRF/FLAN8NrmON3/mj5jFEIP5tbo6ABEiABEggEQjQw+puFm0Pq8kUbB04cMB5yCRiUq/dQw895JT5O4FXyvwMsb755hvnts3+iSeecMqCndieQmNk+a3apUsX9e4Guu/3oTQK3epokt1YYGNCgr1a69Wrl47bhDw75W51tD2sxli1mjdvbmXPnt0y25Y47dgnffv21Xvm5YBdpMcOHTpYJhzaOn/+vFc5vIRojxI6gXjwsJqXGvqdgxefQgIkkH4CXMMaQy8PqAoJkAAJkAAJuCVgjCApVKiQUx2ZSXFtrzG1b8AjaMJU1dOIc2QYhsD7Z0v58uWlevXqMmLECNm+fbv06NFDjCElWJ+ZXkEWYXhYK1eunN4mvJ5zoyPWtyKRETypvl5cJIeCtxMeYqzLhYSi49mzZ+X222+XZcuWaTKdZs2aeemHC3hd4TX19HKjHOtSTRixwKNrjGkUUZKAQO3atXXtNLysWDtOIQESSB8BGqzp48anSIAESIAESCDmCBjPn2CfVlsQXnr//ffL8ePH1ZAy60f13L5vH81aS1m4cKGGFE+ZMkU+/vhjMWtdpX///jJo0KBUxp/9XKAjkgnBOEN4bLjEjY4IyTVeTLniiitSdWsnPkJoNCRUHcEVCa5y584txruXqn0UmPW+GkptPLep7l922WVqtKa6wYKEJYBkZdiT1axz1gRMCTtQDowEMpgA17BmMGA2TwIkQAIkQAKRIICsuDCYTKIX7Q7GVdeuXXU9JQw5ZP/dtGmTjBkzxq86WKv60ksviQkz1i1r4BlFltNXXnnFb/20CuGZhdEIfcIpwXQsUqSIwLD1169dZntXQ9URBqcJA9b2mzZtqmtzfceGNcP58uXTzMTg7/u5+uqrfR8REySXqowFiUMA61jXrl3rRDYkzsg4EhKIHAEarJFjzZ5IgARIgARIIMMIwCsKo7VJkybax8aNGwUhwAhj9Uyc5Buu6qsQDDmEz5qMvOpZXbVqlW8VV9dmLamG3CIEN9wSSEeE3iL0Evtfenqa0T88xzA6q1at6qgTqo7Ybgb7zyIhFUKmYZB6CsKqcQ+JsNwIjHrMB0KZKYlJoHHjxoJ9i5l8KTHnl6OKDAGGBEeGM3shARIgARIggbASwHrJzz//XNetmgRKMmTIEMGPYxioEIStmi1t1FCDYXbo0CFBZmGs2/QVrHFdsmSJVKlSRUOB4WU1W99oeG2DBg2c6jt37pTvv/9er7H3KwShxFj3inDkVq1aaRn+g8y8yNh70003aVgxPLbI9Dt//nwZPXq05MmTx6nr5sStjs8995xm8YUXFOHM2PMVxioMTXiLL730Uqe79OgIllOnTpVbb71VWrdurWPE/rKQxx9/XCZPnixmGxvBGmPMBYxkhEcjBNmeG1sBZDLG3HXr1k294dgfF/vl3nHHHXYVHuOcAF6i4N8FDFaTEC3OR0P1SSBKBNKfr4lPkgAJkAAJkED4CNhZYMOVVTZ8msVWS8bwse666y7LhL9qBlLz80H3Tx0wYIBlvIpeyo4fP94yay61HvY/xV6kixcv1utFixY5dZHx1hhLTnto06z5tIYPH+6V2dYYfF51UM/+FC5c2GnPPjHeQ6t+/foW+rbrGaPYMgmf7Cquj251RIPG26yZgu0+S5QoYRlD0m9fbnS0swR7NmBnSTbGiGU8pM4tk/TJMsmmLOMFdsaM8ffp08epY5+Ag0lw5VW3Vq1a9m0e0yAQD1mCbfXNtk6WSQLmdx9guw6PJEACgQmk4Jb5g04hARIgARIggagS2LJli2CNH/aiDFdm2agOKAKdI+wV4aSeXkPfbpGECOs3sb4TobSBBD8HDh48qNmDkZwJ2W6RNCYccuHCBW0b3kZ4PNMroep45MgRXSOKBFLBJFw62v0gPBsZmTHeAgUKpMkecwT24O5GV7uPZD5iLfI999yjXvRY53DixAld0z1hwgTBHsgUEiCB0AgwJDg0XqxNAiRAAiRAAjFDAMZQMAMQ27sYD2NQnWGcGi9p0HrpqYBESDCYL1ZC1REJkNxKuHS0+0M4dqBswnYd+4g5QsImSmISQPg71pYjLJgGa2LOMUeVsQRosGYsX7ZOAiRAAiRAAiTgh8AXX3yhWXf93PIqgietX79+XmW8IIF4I4BswX379tWtjew1z/E2BupLAtEiQIM1WuTZLwmQAAmQAAkkMQHsh2rWLQclAE8lhQTinUDbtm11T2QkHYPxSiEBEnBPgP8XcM+KNUmABEiABEiABMJEwCQbEnwoJJAMBAoVKiQmGZdMnz6dBmsyTDjHGFYC3Ic1rDjZGAmQAAmQAAmQAAmQAAmkJgDPKrZXQkIuCgmQgHsCNFjds2JNEiABEiABEiABEiABEkgXAezdi8zVy5YtS9fzfIgEkpUADdZknXmOmwRIgARIgARIgARIIGIEkEAMW3YhWzCFBEjAPQEarO5ZsSYJkAAJkAAJkAAJkAAJpJsAwoJpsKYbHx9MUgI0WJN04jlsEiABEiABEiABEiCByBKAwbp3715Zs2ZNZDtmbyQQxwSYJTiOJ4+qkwAJkEAiEjhz5ozuVZiIY+OYSIAEwkPAsqzwNBThVqpXry4lSpTQbME1atSIcO/sjgTikwAN1vicN2pNAiRAAglHIGvWrDqmWrVqJdzYOCASIIHwE7D/ZoS/5Yxt0Q4Lfu655zK2I7ZOAglCIMW8oYrPV1QJMgEcBgmQAAmQwP8ILF26NCa8q4899pgcOHBAGjZsKJkyZUr1SUlJkcyZMzvl27Ztk+XLl0vx4sXl6aefFuy5SAkPgYcffljAd/LkyZI/f/7wNMpW4p4A/g3Wr19f8uTJE3djwd+5Ro0a6fe6XLlycac/FSaBSBOghzXSxNkfCZAACZBAQAI33XRTwHuRvLFv3z7p16+fvP3225I3b940u0add999V2655RZ5//33g9ZPszHe9CKwa9cu2bp1q8A4OXTokHTv3t3rPi9IIB4JNGjQQF++IPnSgAED4nEI1JkEIkqASZciipudkQAJkAAJxAOBjh07yoULF2TatGkB1T1//rz0799f7rrrLj1+9tlnNFYD0krfjalTp8oVV1wh3bp105cB6WuFT5FAbBFAdEabNm10HWtsaUZtSCA2CTAkODbnhVqRAAmQAAlEmUDLli3l9OnTgvA9Xzl69KjAqP3qq6/krbfekk6dOvlW4XUYCFx77bUCrzvW/DVt2lS2b98uV111VRhaZhMkEF0CM2fOlFtvvVV+/vlnKVy4cHSVYe8kEOME6GGN8QmieiRAAiRAApEjcOrUKXnnnXekSZMmMnfuXFm2bJkgPNhTNm/eLNdff72Gqn755Zc0Vj3hhPF8/fr1smnTJuncubOu98O6YIRcU0ggEQg0a9ZMcuTIITBcKSRAAmkToMGaNh/eJQESIAESSAICMDx79eqlno67775bQ3s//vhjueyyy+S9995zCCDst3bt2lpv9erVgi0qKBlDAOHAJUuWlLp162qCqzvuuENQRiGBRCAAY7V58+aCdawUEiCBtAnQYE2bD++SAAmQAAkkKIE9e/YItpVAlk4kQVmzZo08++yzGqI3ffp0ad++vXpP4XGFPP/88xqaCsNp8eLFzAScgd8LbGAA4xSh1ki4BIGndcuWLbJu3boM7JlNk0DkCCAkGH9Ljh8/HrlO2RMJxCEBrmGNw0mjyiRAAiRAAukjcObMGfn0009l0qRJ+kMR26R06dJFEyddd911qRpduXKleviwjhJe2JdeekkefPDBVPVYEF4CK1askHr16sn3338vVapUcRovU6aMvkgYNWqUU8YTEohXAlgLX7BgQV2GwHXw8TqL1DsSBGiwRoIy+yABEiABEogqge+++07+/e9/a3jviRMndAuav//973rMmjVrmrohyc+xY8cEIcLYO5GS8QTwUmDJkiW6htWzt8GDB+uP+927dzueV8/7PCeBeCNw8803S4ECBeSDDz6IN9WpLwlEjABDgiOGmh2RAAmQAAlEksDvv/8ub7zxhtSoUUOqVasm8+fPl4EDB2oSJawbQ+bZYMYq9P38888FBi+N1cjMHrYLwssBeL59BWV79+6V5cuX+97iNQnEJQH8HZozZ46cPXs2LvWn0iQQCQL0sEaCMvsgARIgARKICAGsfURm34kTJ+oeqlj/2KFDB0EiJaxTpcQ+gXnz5kmLFi1k586dghBgX0GIMMKF8TKCQgLxTgBZyIsXL65GK7bSopAACaQmQA9raiYsIQESIAESiDMCBw8elBEjRkj58uV1386tW7fqetNffvlF3n77bRqrcTSf2Lrmhhtu8GusYhjwssIDe+7cuTgaFVUlAf8EihUrJjVr1hQkeqOQAAn4J0APq38uLCUBEiABEohxAvCmLly4UCZMmCDYbiZPnjzSrVs39aZ6JuqJ8WFQPQ8CSIqFJDTYLghr+/zJ/v37Zfz48TJ79mxp1aqVvyosI4G4IoAM5GPHjtUM5Zky0ZcUV5NHZSNCgAZrRDCzExIgARIggXARgDcVWX7ffPNN2bVrl9SvX1/uvfdeDf3Nnj17uLphO1EgcPjwYWnatKmcOnXK6R1bfpw+fdprGyGEeo8cOVLatm3r1OMJCcQrgc2bN0ulSpU0EznC3SkkQALeBGiwevPgFQmQAAmQQAwSgDd10aJF8q9//UuQMCl37tzSvXt3ue++++Saa66JQY2pUrgIDB06VOd8/fr14WqS7ZBAzBHAcoZ27drJiy++GHO6USESiDYBxh1EewbYPwmQAAmQQEAChw4dEuy5Wa5cOfW8/fzzz5pQCcdXXnmFxmpAcrxBAiQQTwRuvfVWrmONpwmjrhElQIM1orjZGQmQAAmQgBsCK1euVA8qEpK88MILulZx48aNGjLXo0cPYeivG4qsQwIkEC8EsL0NMmPj7xyFBEjAmwANVm8evCIBEiABEogSgZMnT+q6VOyZWrduXcG6rnHjxgmS7Lz66qu6xitKqrFbEiABEshQArVr15YiRYrQy5qhlNl4vBKgwRqvM0e9SYAESCBBCGzZskX69u0rV155pTz00EOCDL/wsK5ZswgtLYQAAEAASURBVEZ69eolOXPmTJCRchgkQAIk4J8AEokhiRjW6FNIgAS8CdBg9ebBKxIgARIggQgQwB6a06ZNkyZNmsjVV18ts2bNksGDB8u+fftk8uTJAm8DhQRIgASSiQDWsa5du1b27NmTTMPmWEkgKAEarEERsQIJkAAJkEC4CCCJEtaklilTRjp27Kje0zlz5sj27dtlwIABkj9//nB1xXZIgARIIK4INGrUSPLmzUsva1zNGpWNBAEarJGgzD5IgARIIMkJrFu3Tnr27CnFixfXbRtgrO7YsUM+//xzadmypWTKxP8dJflXhMMngaQncMkll8gtt9zCdaxJ/00gAF8C/IXgS4TXJEACJEACYSGAsN+PPvpIGjRoINWrV5fVq1fLyy+/rGG///znP6V06dJh6YeNkAAJkECiEEC24OXLl8vhw4cTZUgcBwlcNAEarBeNkA2QAAmQAAl4Evjtt9/k+eefl1KlSkmXLl2kQIECsmjRItmwYYPcd999TKLkCYvnJEACJOBBABEnWbJk0XX9HsU8JYGkJkCDNamnn4MnARIggfARgEFqh/2OGTNGjVXsKzh9+nRp3Lhx+DpiSyRAAiSQoATy5Mmjyejwd5NCAiTw/wRosPKbQAIkQAIkkG4ClmXJ7Nmz5eabb9btaL755hsZO3ashv2OGjVKSpYsme62+SAJkAAJJCMBZAueP3++nDp1KhmHzzGTQCoCNFhTIWEBCZAACZBAMAL4IfXGG2/oljStW7fWELa5c+fKxo0b5Z577pEcOXIEa4L3SYAESIAE/BDAfqxnz56VefPm+bnLIhJIPgI0WJNvzjliEiABEkg3gf3798vjjz+u2X4ffvhhadiwoWzatElgrDZv3lxSUlLS3TYfJAESIAESEClYsKDUrVuX29vwy0AC/yVAg5VfBRIgARIggaAEsC1N165dNbPv22+/Lf3795e9e/fKv/71L7nmmmuCPs8KJEACJEAC7gkgW/CsWbME2dYpJJDsBGiwJvs3gOMnARIggTQIwHOK9anYlgae1IkTJ8ru3bvlySef1Oy/aTzKWyRAAiRAAukkAIP1yJEjsmzZsnS2wMdIIHEI0GBNnLnkSEiABEggLAT++usvmTJliiZRwhYLmTJl0gQg3333nfTo0UOwuT2FBEiABEgg4wiULVtWKleurFnWM64XtkwC8UGABmt8zBO1JAESIIEMJ3D8+HF58cUXNez37rvvluuuu05gpCJbZdOmTTO8f3ZAAiRAAiTwPwLIFjxz5sz/FfCMBJKUAA3WJJ14DpsESIAEbAL79u2TAQMGaCKlZ599Vu644w7ZtWuXvPPOO2q02vV4JAESIAESiBwBhAUjV8C3334buU7ZEwnEIAEarDE4KVSJBEiABCJBYMuWLdKzZ08pU6aMvP/++zJ48GD9cTR69Gg1XiOhA/sgARIgARLwT6BatWq6l/WMGTP8V2ApCSQJARqsSTLRHCYJkAAJ2ARWr14tt99+u2b3XbFihUyYMEF+/PFHeeyxx+TSSy+1q/FIAiRAAiQQZQLwsk6fPj3KWrB7EoguARqs0eXP3kmABEggYgQWLlyoGX9r1aole/bskY8//lg2b94sd911FxMpRWwW2BEJkAAJuCcAgxV/p7dv3+7+IdYkgQQjQIM1wSaUwyEBEiABTwIXLlyQadOmyfXXX+8kTlqwYIHYXlZkAKaQAAmQAAnEJoEGDRpI/vz56WWNzemhVhEiwF8qEQLNbkiABEggkgSwNc2kSZM07Ldjx45SokQJWbVqldhe1kjqwr5IgARIgATSRyBz5szSpk0b4TrW9PHjU4lBgAZrYswjR0ECJEACSuDs2bMyfvx4KVeunNx3331St25d2bRpk+NlJSYSIAESIIH4IoDtbb7++ms5cOBAfClObUkgTARosIYJJJshARIggWgSOH36tLzyyiuCzeb79esnrVq10jVPb731llSsWDGaqrFvEiABEiCBiyCAfbBz5MjBPVkvgiEfjW8CNFjje/6oPQmQQJIT+OOPP2TUqFFSqlQpeeKJJ6RDhw66h+rrr7+u2yEkOR4OnwRIgATingCM1RYtWnAda9zPJAeQXgJZ0vsgnyMBEiABEogegWPHjsnYsWPl5ZdfFqxXfeCBB+Thhx+WggULRk8p9kwCJEACJJAhBJAtuFevXnL8+HHJmzdvhvTBRkkgVgnQwxqrM0O9SIAESMAPgaNHj8rQoUPVezpmzBh58MEH5aeffpIRI0bQWPXDi0UkQAIkkAgEWrduLcj6PmfOnEQYDsdAAiERoIc1JFysTAIkQALRIQCP6ksvvaQe1SxZssjAgQPVWOWb9ujMB3slARIggUgSuPzyy+XGG2/UsOBOnTpFsmv2RQJRJ0CDNepTQAVIgARIIDABGKoI+8UHe6Y+9thj8tBDD0mePHkCP8Q7JEACJEACCUcA2YIff/xxQTb4bNmyJdz4OCASCESAIcGByLCcBEiABKJI4Pfff5enn35aSpcuLa+++qo88sgjGvo7ePBgGqtRnBd2TQIkQALRItCuXTtBor1FixZFSwX2SwJRIUAPa1Sws1MSIAES8E8ACTXgTUX4L6R///66TQ1Df/3zYikJkAAJJAuBYsWKSc2aNWXGjBm6dVmyjJvjJAF6WPkdIAESIIEYIHDy5El54YUXdHsaGKvYSxXJlJBgicZqDEwQVSABEiCBGCCAbMGfffaZJmCKAXWoAglEhECKZSQiPbETEiABEiCBVASwFmn8+PEyfPhwOX36tBqqCP+99NJLU9VN9AJkwJw8ebLAeKeQgE1g3rx5smnTJt22yS7jkQRSUlIEazqLFi2aVDA2b94slSpVki+//FLq1auXVGPnYJOXAA3W5J17jpwESCCKBM6dOyeTJk2SZ555Rg4fPqz7qA4aNEgKFCgQRa2i2/W2bdukQoUKki9fPkEmZAoJkAAJBCKAv5t40YdEdMkm+DvZpk0b+ec//5lsQ+d4k5QAfxEk6cRz2CRAAtEhAC/i1KlT5amnnpI9e/bIPffcI0iklGxeAn/0wQaydOlSqVy5sr8qLCMBEiABJVC2bNmkDYtFWPC0adNosPLfQtIQ4BrWpJlqDpQESCDaBD799FOpUqWK3HnnndKgQQOBR/G1116jsRrtiWH/JEACJBBHBBAKvXPnTtmwYUMcaU1VSSD9BGiwpp8dnyQBEiABVwQWL14stWrVkvbt2+vaI6zHQzhwqVKlXD3PSiRAAiRAAiRgE7jhhhukSJEimi3YLuORBBKZAA3WRJ5djo0ESCCqBNatWyfNmzeXJk2aSP78+WXt2rXy4Ycf6jrNqCrGzkmABEiABOKWABJOYU/W6dOnx+0YqDgJhEKABmsotFiXBEiABFwQ2LVrl3Tp0kVq1Kghx44dkyVLlsgXX3whVatWdfE0q5AACZAACZBA2gSwjhUvRXfv3p12Rd4lgQQgQIM1ASaRQyABEogNAr/++qv06dNHKlasqN7Ujz/+WL755hu56aabYkNBakECJEACJJAQBBo3bqzbn82YMSMhxsNBkEBaBGiwpkWH90iABEjABYETJ05o1l9krURipXHjxsnGjRvl9ttvd/E0q5AACZAACZBAaASyZs0qrVq14jrW0LCxdpwSoMEapxNHtUmABKJPAHupvvHGGwJD9dVXX9XtaXbs2CH33nsv9xGNwvTY2+JEoes0u9y7d6+ULFnS67Nly5Y0nwnlZqyO++GHH/Ya8/333x/KsFjXDwHOtR8oSVyEbMHLly/XvbyTGAOHngQEaLAmwSRziCRAAuEn8Pnnn+teof369ZNu3brpFgODBg2SHDlyhL8zthiUADIwY01XLMqll14qAwYM0A+yRWP/3b/++uuiVUX26eLFi8uqVasuuq2MaADeH3vchw8flt9++y0jusnwNhFBUahQIedTokQJqVu3rjz77LMRMxQ41xk+zXHZQcuWLfXlKP5/RCGBRCZAgzWRZ5djIwESCDuBNWvWSKNGjaRt27ZqsP7www8yZswYyZcvX9j7YoPuCSD5yJ9//un+gQjWzJs3rzz44IP6ufHGG8PW8/79+2Xfvn1ha89fQ5Zl+St2VXbzzTc7486ePburZ2KxEryaWJ9+9dVXyxNPPKEvqM6cOaPLAGC4HjlyJMPVjsRcX8wgQpnri/lOXYyOifhs7ty5Bey5jjURZ5dj8iSQxfOC5yRAAiRAAv4JwCs2ePBgee+996ROnTqyYsUKPfqvzdJIEEAGZhgSEHgsT548Kdu2bXO6vuSSS1LtdYsfy1u3bpVffvlF98QtWLCgUx8nP//8s+C5PHnyyMqVK3WOs2XLJj/99JOcPn1ajRbUQzvbt2+XwoULCwxSGC3ff/+9bllUtGhRVEm3IMv0zp07tY+rrrpKypQp49UW7p0/f14OHDig5fhuer4wQf/4Iespx48f10Rg2F4JScGw/i2YvP/++zJq1CiZN2+eehd964M5QpuPHj2qnt7SpUv7VnF9jbnbsGGDeiwLFCgg1157reTKlcvv83gxgdB7ZEfFXCHcGmH52OrDU9zW83wmrfNq1apJ3759tcrw4cPlueeekyFDhuia9aFDh2o5+sR3pVixYpIzZ06Bd/bbb7/VOYSevoJlBXjpBe/zNddco98nzzrpmWu0BZbgiLkGo0Didg5DaTNQXyiH8d+5c2f9Pr300kuSOXPmtKrzngsCiCx56KGH5NSpU/qdc/EIq5BA/BEw/9OlkAAJkAAJBCDw+++/WwMHDrSMh8gyP4otk/k3QE0WXywB88Md7jxr/fr1rpoaO3as1scz/j6VKlXyascYDlapUqW0bqZMmfTYs2dPyxhLTr3bbrvNMj/+LJPZWe8bI8UyhqtljFbLGETW6NGjtS6eQZ8mwZb1yCOP6D1bB2O8OO35ntg6+xujMR6sK6+8Utu128LRhP1Z5seo05QxOlPV8azv+R1Fm8bIsjBee8zoY+HChU57vifGqLDMyxnto2vXrpYx1L2qoE1jrOm/Cc9+H3/8ca96nhfQGWz9CZhkyZLFa0yo/8knn6SqPnv2bL+MjAfSq67bel4PBbgwL0ZUNxP+71XDvCyxjMFltWnTxinftGmT1jUhmtawYcOcceG7Y4xcpx5OPvroI+vyyy/3GnfHjh0tEz7t1Atlrg8dOmSZvTm92rviiisskwjOac8+cTuHobRpt53WXKMO5hvczB7VFtimV8yLHOuFF15I7+MJ89zBgwf137a/eU6YQXIgSU8Ab3ApJEACJEACPgSM58MyCZUs46WwjPfKMt4Ay3hPfGrxMpwEQjVY8WMahh8+xqNlmfBM5xplxpPqqGc8p5bx2FktWrSwcA4DcOLEifpDz6yzdOrBqCpSpIgaV//5z3/0xz8M3zlz5ljdu3e3GjRooHVtgxUGAV5kzJ8/X/uD8QIjzqwrddr0PEnLYMV3Di9Hli1bZhkPsGUyTVu9e/fW9p566imnGRhFGN/zzz+v99555x2vcXsaASbxkRqWMGLx/TVeYeVkPMiW8dA6bdonGBcYwLgdMWKEXex1hAGMMd59992WCcW2jIfXmjt3rjV9+nSvep4XaRkx06ZNsyZNmmQZb61lPHkWrs06UZ2vP/74w2kG44LeTZo0sYyH1TJhuRaMxqVLl3oZ9G7rOQ0HOUF7GK+vwYo5RjleethiG6zGW2rBoFqwYIFlPO/WDTfcYBmvtmUb1vi+4Fmwxlya0G5r5MiRasjdcccddnNWKHNdr149y3j7LeMZ17nFi5bq1atrm/gueYrbOQylTbv9tObargMul112mWU8wDqXdnkoRxqs/6NVv359/fv0vxKekUBiEaDBmljzydGQAAmEgQC8T5UrV9YfmPjBb0Iew9AqmwhGIFSD1bM9/HiFxyaQ4Ac6vOQwiDylQ4cOlgndtEyIrRbDgDAhlJbJ7KvGBYwK1IGY9YvqEcO5bbCaME8vww/GG56Bl9afpGWw+qsP7yZ+2MPL6itTpkzRvmCY+BMYpPAMP/roo163baPK1yDFmOFRhtEDD6E/wRzBmIUnMBRxY8R4tgfPGTiafYydYvv7gXlIS9zWS6sNz3v+DFa8LDHbVqmOML5ssdnie4EXI7bAE4/xmPBqLapZs6aFOnhJ4Sm9evXSejDIPSXYXM+aNUufw0sYT/nxxx/17xhettjidg5DadNuG0e3c40XSuXLl9cXgkuWLPFswtU5Ddb/YULkB7z18JxTSCARCXANq/k/CIUESIAEQADr4syPe5k5c6a0bt1aTEiimB9UhJMABLDmGOsKV69e7TUarO/D2i976xncxFpF1LXXiNrZh42hpmtHPRswxqzX+k5k7UVGWWMoeFYL6RzrFrHOFusGzQ8PXZdmPI0htYHKSBB29uxZXQv6xRdfOM9jHSHWe3purYNMwxgn1l1i7S7WU/oTcMTz9913n7/b6S5DEiOs9UQSKZxjXS7Ec9z4t2g8hmIMbV0/3KNHDzEvKVKtx3VbL1RljZdd1zhDN/DC9+GZZ57RpDe+bZkXJGI89U4x9mQ23nhdA411rkgS9sADD6Raw3nLLbeIMTpl8+bNui7XaSDIiTHstQa2OfEUEwKvc2kMaafY7RyG0qbTeAgnmCf0YV5+SLNmzeS1116Te+65J4QWWNUmgH+7ZmmCmKgQMREIdjGPJJAwBGiwJsxUciAkQALpJYCENEig8sorrwiS3CDJDH5AURKHALKsIkFTly5dUg3KeDDVaLVv+Cbv8b226wU6YmsjJGgKVWA4d+rUSbBFBZJBGU+VGpbGmxeS8WL3izFDjPcl1b7A2GoHhqctMAxhKKI8rSQ9MKYhxjtoP3rRR7P2TrBHK/4d4kUBklzh3FdgIJroBzUSjcdRTJizMurfv79gSyk7gY/ber7tB7sGH+NtFSSXgmFp1otqpnB/z0EHT0FyLhhmECSLQtIsGLC+YicBw8uKUAQvXDB+42VL9Rja9Hw54XYOQ2kzVacuC5A9GvqBB9hS0kfAeJv1u4hswTRY08eQT8U2Ae+/qLGtK7UjARIggbASwA/2N998U8qVKydvvfWW/rBHplcaq2HFHLHG4I0MJMici0y6MASQ1db3gy1LwiH4TiHTcIUKFUJuDt46GKswxEwiFfWywTOGlyhpSaBx29mKzVrXVOPF+CdPnuw027hxY/V2oS2z3lKw76c/MQmbtNg2hv3VCaUMepjETprNFpmbEeWAMWOrKH8CgwzZZeH9NiGr+iP9ySef1JdNnvXd1vN8Jti5CRfXl1nInow+zbKBYI/4vQ/PKwxafwztMmQ99ieB5hrzAqMP3xtfQZue7bmdw1Da9O3TzTXmG9s8IaLFrH/WPXvdPMc6/gnAu87tbfyzYWn8E6DBGv9zyBGQAAmkg4BJbCM1atTQsDx4tbBFCfbKNNlK09EaH4k2AXirEO6LcEt/glBSeFjhPc9IMZlfVYf07LcK/WFotW/f3lERocWBvG22h+7LL7906nueVKlSRb/PJimTZ3HAc7y4+frrrzXsFqG248ePT1XXrL3UsgkTJqS6l54CkwxIPbsImfX0DvqGbvu2jW154OU02YDVs4gQXX/itp6/ZzOqDB5sbNsDQ83XEw/PMTz+VatW9eo+2Fzjbxlk6tSpXs8hLBzhxdg72ha3cxhKm3bbbo8I/4YeMLC/+uor3dfa7bOs558AwoIRUg+2FBJINAL8ZZZoM8rxkAAJpEkA3i+TFVbgJcGPcvzAw16FlPgmgB/kWA/XrVs39dhhD0+zPYiYjKs6MLPlinoUTUZXwbpTGEgwDBD2aBKV6HV6CGA9IDx9MChg7MHzBm8l+rAFIZjw3EO+++47PSK0FS9JEBLZqlUrLcOaPng24V002VnFZL8V7PcJ/fwJDArsF/vyyy/rWtfatWurAQBDFR5erKc1mXwFxiX4ICQV7ZqtmjREFAaf7YW12wcTrHc1GXHlH//4h3o74dG0X+TUqlVL28G/H4TI4mUPwohNIh9BKPS9995rN6Vc7BcIOMLTh/BfCNYJI7QWoYxoG4YaDBiEP7/++uuyfPlypx37BD/ETXIewfgQLg0vK9aZw7Nosjfb1fQHu5t6zgNROMEShLZt20rTpk01nBnswADfJSxNAFNPCTbXMFZQB99zrFtu2LChroM2Car0e4D1jba4ncNQ2oTeweba7h9/c/HvEC+R4Fm1w6Dt+zymjwD+TSFUH0ztlxLpa4lPkUAMEjDhJRQSIAESSHgC5seUNWrUKCt37tyW+aGc5hYcCQ8jRgdoZ3fFNh+hCrY/MUl4NCOq+V+tZkw1P8y9msEWLHXq1PGqgyy6ffr0ceohS7Ax/PQaW8ugLWwTAjHGqGbQxbmdJRgZhe3+zDpF67HHHvPaYgV1jQHi1LHr2kc8Ywv6w7Y59j1s7YK9OqGTvZ2OXdc+Yr9RbKtjP4P9LT0z/OJ7j/1AsT2TXQdHY6h6bftjt+d5NElwdGsWbLniKcZQtbDNDnS32zQGlu5J61nPeEyd+3Y9+2i8t05VnOPfJe5hPpCB2Bjuer1o0SKnHrYWwtZEdhs4GmNH9zc1RmvI9ZwHgpz4yxIc6BE7S7B5iRCoilOOrYaMgeGMB/NtwrSd+74nwebaeOItbIkDhmCDrNjYlxXfK19xO4du23Q715gnZLxG1mLocDHCLMGp6SEbOrZUopBAohFIwYDMHzYKCZAACSQsAbPthJhtRjTZidnnUvCBZ4sSWwSQGAZrSY3Bmu71gfY6PiTugRfOn5itRDQLLbxaxpBLlWXW3zO+ZUiQBC8uskoPGTJEExjBOxkOQfIZeMmQbditIEkREidhzBi7P4H3EvVQx9eD568+yuDdRVhtIIG3FnWwPtg30VCgZ/yVY97ggcX6zrT6w08WhJFirBgnkjT5S4rltp4/XSJdduTIEfWQB/q++uoTbK5tlliDaiei8m3D89rNHIbapmf7vufBvlO+9QNdY10usgoj4Rbl/wkgS/BNN92k3nVEbFBIIFEIMCQ4UWaS4yABEkhFANk4zT6qGoaI8DaEOmKbB0riEsAPdN8wV9/RIgQVoajhErNvabia0nbSY/hCh2B6wDjHJxRJy3hEO24N32B9Yt6MhzFYNTVOkXE3mMCIdVMvWDuRuA9jPxQJNtduWdp9upnDUNu02/Z3DPad8vcMy9wRqF+/vv4bR/IlE+3h7iHWIoE4IMCkS3EwSVSRBEggNAJYW4eMq/DWIePo3LlzdV0PjdXQOLI2CZAACZBA/BDAi4U2bdro/+/iR2tqSgLBCdBgDc6INUiABOKIALLAYruJF198UczaPQ0vRXIlCgmEkwB+GGK/Q2TWpZAACZBArBBANBES0GHbIAoJJAoBGqyJMpMcBwkkOQFk/0VG2BYtWsh1112nWUsREoUtJCgkEG4CWD+JTL+eWXHD3QfbIwESIIFQCWAf8Zw5c+q2SaE+y/okEKsEaLDG6sxQLxIgAVcEkAwE20Bgaxpse2EyiepWF0jGQiEBEiABEiCBZCKAhIKIKsI6VgoJJAoBGqyJMpMcBwkkIQGEPV1//fWaXAJZgDdu3Chmy4QkJMEhkwAJkAAJkMD/E7j11lt1z2JkgKaQQCIQoMGaCLPIMZBAkhE4evSo3H///VK3bl0x+//pOtXnnntOsE0JhQRIgARIgASSmcAtt9yiW20h4ohCAolAgAZrIswix0ACSUTg/fff1/BfhDtNmTJFFi1aJBUqVEgiAhwqCZAACZAACQQmgBe52I+VYcGBGfFOfBGgwRpf80VtSSBpCWBPVYT7duvWTW677TbZsmWLdO3aNWl5cOCRI3D69GkpWbKkDB8+PHKd+vR04cIFady4serx448/+tyNnUvoScl4AshQ3blz5wzpiHOYIVgj3qi99/jZs2cj3jc7JIFwE6DBGm6ibI8ESCCsBPDjCUmVKlWqJDBaly1bJm+88YZcdtllYe2HjZFAIAKWZcmePXsEoejRkj/++EOWL1+uemCtdixK+/btBT+SKRlPAFnRDx48GPaOOIdhRxq1Btu1ayf4u4EoJAoJxDsBGqzxPoPUnwQSmMD69eulTp06mlTpkUceke+++07q16+fwCPm0EjAP4G8efPKrFmzZMKECYL1abEo69atkz///DMWVaNOLglwDl2CioNqyJRfs2ZNmT59ehxoSxVJIG0CWdK+zbskQAIkEHkCZ86ckWeffVZGjRqlWYDxI+qaa66JvCLskQQ8CKSkpOgVPK14eYK100WLFvWo8f+nJ0+elA0bNsjhw4elQIECcu2110quXLlS1UMBDLwdO3Zo9AD2DEbocdmyZcXu66+//hI7BLh06dKCz7lz54LuL/zrr79q2Dz2Y0R0wsUkJEtLx2PHjgn6gkBXjH3btm16jf9gTKVKlXKuf/nlF61XokQJLYO3+MSJE1KtWjXBdhy+Au/21q1bBc9hHAULFvStote7du2SnTt3CupfddVVUqZMGa968EhClzx58sjKlSv1RRj20v3pp58EId9XX321V/1QLtLi49kO5u2HH36Q3377Tf+eFS5c2PN2qvNQ5xB/NxEJkDVrVv2eeDaYFsdQ59CzXZ7HNgFEPCBCCS+6MmWijyq2Z4vapUnA/BGjkAAJkEDMEFiyZIlVrlw5y/ywtMaNG2eZfVZjRjcqkrEEzI95y/wPyzKe9YztKMTWjRGmej355JOW8fRbxpjUa+g6dOhQr9bGjh1rZcmSxbmPOvnz57c++eQTr3q4mD17tnXllVd61UX9/fv3O3WNIZbqflp8jKFsma2evJ4xhplltrdw2gzlJJiOGC90DvQxRqZXdx06dLBq1Khhbd++3TJ7JzvP4d+8Mba86pp9lS1j7God82Nbjz179rQwH7YYI9kvQ7Pe3Tp16pRdzTLr3i2z9ZVlEtFoO8ZAtozhaoEN5nP06NFO3VBOgvGx2/roo48skwjHGS94dezY0TIvNewqztHNHIJdo0aNnGcwVlwbo9wyHjWnHCfBOIY6h16NR/HCvJSwXnjhhShqEPtdb968Wb9zZjlB7CtLDUkgDQJ4G0khARIggagTMF4rq1evXvrjsU2bNtbevXujrhMViCyBWDdY8+XLZxnvpzV//nzLeP0sfE9heKxatcoBNW3aNGvSpEmWSQpmGU+ahWvjTbSMh9Uy68mcesarpS9lTPIcy3hYLeMds4xHzVq6dKmXoWW8dxZ+dOIzePBg7S+QwQqDL3fu3GrAffjhh2oAwvj55z//6dW3o0SQEzc6Hjp0SF8wQCcTgmiZraaca5SBk6fAYL3iiiv0069fP8t4OC3bYOrdu7dT1XhElVmLFi0snMMgmzhxogXDdcCAAU4947W0Bg4caJm17ZbxwlrGY2uhHczLU0895dSDwVqkSBE1XP/zn//ofRjTZtsPq3v37laDBg2cum5P3PBBW/i+QB/oACb79u2zRo4caWXOnNm64447vLpzO4eeBqvxEFs333yzGt+ff/65V3tuOIY6h14dRPGCBqs7+OXLl9cXbe5qsxYJxCYBGqyxOS/UigSSigA8AiY8zipUqJAFTwQlOQnEusFqwnWtAwcOOJMD4wKGCDx3aQm8QKj3zTffONXssT7xxBNOWbAT27ALZLB26dJFvbuB7gdr3/d+qDrCgGjevLlvM17XMFjB4vnnn/cqN6HTllmv7pT17dvXMiHCavQ7heYEz5sw5zQjL2DAmaRsFrystsBYhPcRL8LgwYYOaAuCOYD3M1Rxy8esI7Tw3YFx7Sl4QQc98MLCFrdzaBuseNEB5mAF49tXQuXoZg59+4jWNQ1Wd+TxQgcv2igkEM8EuIbV/N+CQgIkEB0CR44ckT59+gj2Vv373/8uY8aMEewfRyGBWCRgDBwxL1Uc1YoXL67X9hpT+wbWEpowTDGeNLHXFeIeMnbaYrweUr16dRkxYoSY8Fjp0aOHGMND1x/adUI9IoswkpRVrlw51Ef91s8IHdHRpZdeKsZI9Opz6tSpujbXLlyxYoUgaczq1avtIj1iHarxtooxPHW9r30T61ex1hXrQ82PMsHaXU/eqId1smjTvHTQx+yMxljbZ5Ye2E25Prrhg/WtWIP/wAMPiPGoerWN5FnGayzGe67rlnEzlDnEdiW33367Zk6fOXOmNGvWzKt9XITKMVUDLIh7AvieG4++rqsP19+GuIfCAcQdARqscTdlVJgEEoMANjS///77xaz3E7MOTFq1apUYA+MokooAEgUhaY8tn376qX6vjx8/rsYREvvg3FdgJC1cuFCeeeYZmTJlinz88cdi1rpK//79ZdCgQamMG9/nfa+R8AhG3I033uh7K93X4dbRVsROKGVf42hCWj0vxXhBNZmT8Th6leMCW1rBaIXg2KlTJzGhsJqQCQzRvglzdYxArWj+49uv77Vdz+3RDR8ki4IxbMKgUzVrJ5CCkQ0JdQ7xvUMCMBMGnirJlN2ZW452fR4Tj8ANN9wgJhxeswXTYE28+U2WETFlWLLMNMdJAjFCAF7Vrl27yq233iomZE+QJZTGaoxMDtUIiQCyvsIgMAmD9DkYD/hum3BNzWqL7L+bNm3SyAF/DSOa4KWXXlKPH7aswY9Jk9hJs3r6q59WGTLDwiiCPuGUUHWEdzMcguzLZs2wekzB1fdjZ/WFwQ9jFQY/9iWFtxLMkSk4EhKMDwwFGLb+5sUuQ1ZoSKhzCMPdhAFr+02bNhVkQvYVtxw9nwvXHHq2yfPoEcCLGezJipfEFBKIVwI0WON15qg3CcQhAYStYWsKk/REvaomOY16S+JwKFSZBNRIgtFqEicpDbx8QQgwwjQ9Q9t9w1p90cFQQXgoIg0QNmqSOPlWcXWNPRcRUgqjLdziRkcYzBgrwmAvVhAujW1d5s2bl2ZT6A+s27dv79RDiLbttXQKM/gkEB+EMGNbI/zt8/TEQx141mF0Vq1a1dEu1DnElkF42QFWCCmHYe8pbjnaz4RzDu02eYw+AbwgRmj67t27o68MNSCBdBBgSHA6oPEREiCB0AjAq2oS08h7772na1XhVcIPNQoJxBMBrAeENw/rWE0CJRkyZIg0btxYDVSMwySB0RB3GCIwPBCW+vrrr6sR6TtOrHE1WzhJlSpVNBQY6yrN1jcaPmoy1jrVsTbz+++/12vs/QpBKDHWvSIc2TM6AevUFixYIDfddJOGFcNja7azEZOlVsy2LboHqTbg8j9udbSbM9uqKJdu3bqppxl7z2IvWpMJ167i+vj444/L5MmTxWxjI1g7jJcA+JuBsGeEzuIagnWkixcvVi92vXr1xGRZluHDh2sd152ls6JbPs8995y0bdtW4AVFuDf2xMV3BIYm9sjEml5b0jOH+K5hDTCMktatW+t3AGt4IW452v2Hcw7tNnmMPgHMK75n8LKaRFzRV4gakECoBOI5YxR1JwESiH0C5n+QmgHYhKbpvpOxrzE1jBYBO+tquLLchmsc2Ovzrrvu0m1RzP9jNbMr9k/F9irISOsp48eP161lUA97fGKvTWNQ6TOLFi1yqiKjK7a6sdvD0axptIyx5ZUB1xg0XnU86yOztq8Yj6NVv3597duua4zidG1r41ZHWwds22OSR1nG2+joXKtWLfu2HpGZ1xieXmWBLoxHSDMHe7YHpiZRm/MItrLBljT2WLGFEDKNIyuw51Y1uK5du7Y+h2dQ3yR702vsr5s3b16nTbcnofAxIcuaKdhTT2OQ++3KzRzaWYI9G7CzSJuXGBa2Q7LFDUe7rps5tOtG+8gswaHNADJQm5dZoT3E2iQQIwRSoIf5A0ohARIggbASMHsUagbgd999V+688055+eWX6VUNK+HEa8zsXSpYm2gM1rBlug03pf9j70zgp5r+//+ORKmEKMkSUUgqoVQq2bNFVIhCZEuylK1kyVqKLCmSLWvZElHRIlHJVkQkRJFsocj9v1/n/zv3e2c+s9w7nzszd2Ze78fj09zl3HPe53nuTPd93+/zPgjrRMir1ysW3waS7GB+IuYvIlQ0meC/X8y7RDZbJGdCBtvyJgKybf3333+mbngl4dHLVDLREf1Hv9AnJEEqryDsWpcQMv3Q5W8SMsXvDbLmerM4l7ddP9cH5YNoE1zjh0tYY2j74YejLRv2GNp6w/zE3N9evXoZr3WY9RZrXZjn3a1bN/Pd9HP/FSsH9qswCTAkuDDHjVqTQKQJINQRRipC9xD2hvl5FBIoBgIw/tIZgJiHqp6+tN2Fcape0rTlMimARD8wmMsrmeiI/iPZT1iCTOIIt04l+ZpiEJQPEkn5lbDG0Lbnh6MtG/YY2nr5mT8CSHKIewDTGnroMnIUEigkAjRYC2m0qCsJRJwAPBxXX321mU+Gtd8eeOABgUeEQgIkkH8CkydPNlll02kCz1Xfvn3TFSu68+RTdEPKDnkIYPkjLB81ceJEGqweLtwsDAI0WAtjnKglCUSeAMI4kWxl2bJl8uCDD4rO+Yu8zlSQBEqJADLn6jzhtF2GF6YUhXxKcdRLq894kYwEiGvXrhUkRaOQQKEQ4BzWQhkp6kkCESWAeVbDhg0z60fut99+JvtlvXr1Iqot1YoygUKYwxplftSNBEqJAOewBh9tLH+EqQKYz6qJyIJXwCtIIE8EuA5rnsCzWRIoBgJIhII1KK+66ioZNGiQWV+VxmoxjCz7QAIkQAIkUGwENBO5YPknLG9DIYFCIkCDtZBGi7qSQIQIIPsv1pDEG1usSYn1/pAkhEICJEACJEACJBBNAggLRjJEZI2mkEChEODTZaGMFPUkgYgQwPIRXbp0EV1v0WQCnj9/vjRt2jQi2lENEiABEiABEiCBZARgsK5Zs8ZERCUrw+MkEDUCNFijNiLUhwQiTGD27Nmyzz77yKxZs+S1116TESNGyGabbRZhjakaCZAACZAACZCAJYAlohAdhWzBFBIoFAI0WAtlpKgnCeSRABIr3XTTTdKuXTvzH90HH3wghx56aB41YtMkQAIkQAIkQAKZEICX9YUXXhDHcTK5nNeQQM4JlGbu+pxjZoMkULgEVqxYYZargXf19ttvL8n1GQt39ApT89dff12WLFlSmMqXmNaYIlCjRo1I9fqff/6RTTbZJFI6UZnwCWBpFkpmBDp16iTXX3+9zJs3T5Ddn0ICUSdAgzXqI0T9SCCPBCZNmmQWGN9yyy3lnXfe4VzVPI5FKTQNw6dy5cpy6aWXlkJ32UcSIIFyEsASLZTgBJo0aSI777yzyRZMgzU4P16RewJchzX3zNkiCUSewPr162XAgAEyfPhw6d69u9xzzz1StWrVyOtNBYuDAMPUojuO8Mhcd9118sorrxglt956a/nmm28iM5d9/Pjxcuqpp0rFihVlwoQJcvTRR0cXJjUrN4EKFSqUu45SreCSSy4xuSgWLVpUqgjY7wIiQA9rAQ0WVSWBXBD4/PPPpWvXriYk85FHHjHhwLlol22QgCXAh1BLIjqfc+bMMWstI1wbxiBk4403liuuuMJ4xaOi6V9//WX02rBhgyDs8cknn5TOnTtHRT3qQQKRIYB5rHgpjekXu+++e2T0oiIkkIgAky4losJjJFCiBB599FFp1qyZwGB4//33aayW6H3AbpOAJTBz5kxp3769HHjggTJ9+nRz2K7fiAzhvXv3tkUj8Yl5jVgPGl56GK0nn3yyPP7445HQjUqQQJQItG7dWmrWrMlswVEaFOqSlAAN1qRoeIIESocAvBJnnXWWWVe1V69e8vbbb0v9+vVLBwB7SgIkEENg2rRpggfagw46yCxjhZPWUMU2vKx9+/aV6tWrYzcyAoPV66GH4YppDWPGjImMjlSEBKJAABESxxxzjJnHGgV9qAMJpCJAgzUVHZ4jgRIg8MUXX0jLli3NfC+kuR82bJhUqlSpBHrOLpIACcQTwPrKBxxwgHTo0MEkWsN5r6Fqy8OLefHFF9vdyHwmyhwLoxUv4kaOHBkZPakICUSBAMLm586dK99//30U1KEOJJCUAA3WpGh4ggSKnwAWDm/evLmZ87VgwQLztrX4e80ekgAJJCKARGtHHHGEzJ8/35xGSG0iwZIxMAC32WabRKfzesxrsMKD5PW2XnTRRWZprrwqyMZJIEIEsJ56lSpVzJqsEVKLqpBAGQI0WMsg4QESKH4C8JhcdtllcsIJJ0iXLl1MCHC9evWKv+PsIQmQQFICJ554omy++eZJz9sTMGQvv/xyuxupzz///FP+++8/oxP0tBmn4RGGIEkU1p+kkAAJiMnujZdUzz//PHGQQKQJ0GCN9PBQORIIn8CKFStMEpX77rtPkAV41KhRsummm4bfEGskARIoKAJYjxGJlbAWLryTiQRzV0855RTZaaedEp3O+zF4WK1nGJ4jCDyrDRo0cHUbNGiQXHnlle4+N0iglAkgWzDmrP/666+ljIF9jzgBGqwRHyCqRwJhEsB/Sk2bNpUff/zRzFtBMhIKCZAACVgCMFrfeustEyaYyGhFdEaUjb3ff//deFURtnz++ecL+rN69Wr55JNPzDz9Ro0ama7ecsstkZyDa8eBnySQKwJYqxiRCHZt5Vy1y3ZIIAgBGqxBaLEsCRQoAfxnNGTIEDnssMOkbdu28t5774l9cCvQLlFtEiCBLBHA0lYzZsww4cFeoxXeVWQV3XPPPbPUcvmr/e2330wl//zzj5x++uly7rnnynPPPSc///yzWZf1o48+kpdeekmaNGkid911FxMxlR85ayhwAjVq1JB27dpxeZsCH8diV58Ga7GPMPtX8gR++eUX85B53XXXmQzATz/9tFSrVq3kuRAACZBAcgIw6GbNmmV+K6zRCu/qNddck/yiCJyxSZdgVO+9997StWtXM+Vh3LhxrnbwKGGd6TfeeEOOO+449zg3SKBUCSAsePLkybJu3bpSRcB+R5wADdaIDxDVI4HyEFi0aJHsv//+snDhQuMx6dOnT3mq47UkQAIlRAAGH4xWu9Yq1mTF70mU5Y8//jDqnX322eYTSaROPfXUhOuwYumeHXbYIcrdoW4kkBMCMFjxsgcvcSgkEEUCNFijOCrUiQRCIICsfy1atJBtt91W5s2bZ7ZDqJZVkAAJFCEBvNw66aSTzEOrt3t77bWXzJ49Wxo2bCg33HCD91Qkt/HQjYzASAxlBRnRkQ2dQgIkkJjA9ttvb+Z7M1twYj48mn8CNFjzPwbUgARCJYD5qgj/xZI13bp1M9n/ateuHWobrIwESKB4CHz22WcCb+MPP/yQsFN77LGHLF68WOBhjbr8/fffcsghh0itWrVcVXfZZRdBZmAKCZBAcgLwsr744ovuslDJS/IMCeSeAA3W3DNniySQNQLIkIn/dG6++WbBsjVYsqZSpUpZa48VkwAJFD4BhM3CYEWWUD/rsEa5x23atEm4Ruznn38uWG+SS3dEefSoWz4J4Nlh1apVZl32fOrBtkkgEYEK6o1xEp3gMRIggcIisGTJEmOsrlmzRp599llp1apVYXWA2pIACZBAlgjAUN1uu+1M4rnevXtnqRVWSwKFTQCh/x07dpShQ4cWdkeofdERoIe16IaUHSpFAvCMIBkKsv9iviqN1VK8C9hnEiCBZAS22GILM0f3008/TVaEx0mg5AnAy8p5rCV/G0QSAD2skRwWKkUC/glgfdVrr73WrDl4//33myUc/F/NkiRAAiRQGgT+++8/k5CpNHrLXpJAcAJz5841CRo/+OADady4cfAKeAUJZIkAPaxZAstqSSDbBJBcBGsMIpnI8OHDZezYsTRWsw2d9ZMACRQsAWQPppAACSQngEitOnXq0MuaHBHP5IkAf73zBJ7NkkB5CKxcuVLatWsnU6ZMkddee00uuuii8lTHa0mABEqAAH43/vnnnxLoKbtIAiSQCYEKFSrIcccdJxMnTszkcl5DAlkjQIM1a2hZMQlkh8BHH31k5quuXr1a3nnnHTn44IOz0xBrJQESKBoCK1asEGTQ7d+/f9H0iR0hARIInwDmsS5cuFCWLVsWfuWskQQyJECDNUNwvIwE8kEAyZWQUKlevXqCuSa77757PtRgmyRAAgVG4JRTTpGKFSvSYC2wcaO6JJBrAu3btxckKWPypVyTZ3upCDDpUio6PEcCESJw1113Sb9+/aR79+5cXzVC40JVSKAQCGDZq+rVq0vt2rULQV3qGCECSFaFnAmU0iHQs2dPQVQGphxRSCAIgc022ywrye1osAYZBZYlgTwQ2LBhg/Tp00fuu+8+QUbgAQMG5EELNkkCJEACJFCKBDDtZPr06aXYdfaZBEggIIHDDz9cXn311YBXpS9eMX0RliABEsgXgd9++82sHThr1ix59tln5YQTTsiXKmyXBEiABIqGwKRJk+TBBx+UCRMmFE2fstWRn376yWSkR3QPhQRIgASSEXj44Ydl6dKlyU6X6zgN1nLh48UkkD0CX331lRx99NGyZs0amTFjhuy7777Za4w1kwAJkEAJEcAcPWRCRXKZJk2alFDPM+vqbrvtJkcddVRmF/MqEiCBkiAwc+bMrBmsTLpUErcQO1loBObPny8tW7aUSpUqybvvvktjtdAGkPqSAAlEmkDr1q2ladOm8umnn0ZaTypHAiRAAiQgQoOVdwEJRIwAkhxgjdV99tlH8Laqbt26EdOQ6pAACUSRwK+//io333yzIEkOJT2BBQsWmFDX9CVZggRIgARIIJ8EaLDmkz7bJoE4AuPGjTNhwJir+vLLL0vVqlXjSnCXBEiABMoSwHx3JLu45557ZOXKlWUL8AgJkAAJkAAJFCgBGqwFOnBUu/gIwDPSo0cPueyyywSG6yabbFJ8nWSPSIAEskIAc95htCKb63bbbZeVNlgpCZAACZAACeSDAJMu5YM62yQBDwGE71100UVy//33y8iRI+WCCy7wnOUmCZAACaQngCkEH3/8cVbWv0vfOkuQAAmQAAmQQPYI0MOaPbasmQTSEsBi7CeeeKI89NBDZtkaGqtpkbEACZBAEgIbbcT/0pOg4eE8EYjqfOpvvvlGdtppp5i/MBNwRbXf/fr1i+lz796983RnFE+zUR3rbN/juR5BelhzTZztkcD/Efj555/l2GOPlUWLFskbb7whrVq1IhsSIAESIAESKAoCnTt3lvXr18uLL74Yuf5gWaPLL7/c6PXWW2+ZF8b//PNPufWcNm2anHHGGfLMM89IixYtyl1f2BVgaaJddtnFVDtgwAD58ccfw24iZ/UNHDhQRo0a5ba3zTbbSMOGDQVG+CGHHOIez+ZGKd7j2eSZqm4arKno8BwJZInA8uXLTYKUP//8U2bPni177LFHllpitSRAAiRAAiSQewLvv/++YP3WKEr16tXlwgsvdFV79tln3e3ybHz33Xfy7bfflqeKtNc6jiMVKlRIWy5RARhy1pi77rrrEhUpmGO///67rFq1ymRGxxKAc+fOlSlTpshzzz2Xs+lVxXKPl+eeytUNQ4M1V6TZDgn8H4HPPvvM/Iex1VZbydSpU6VOnTpkQwIkQAK+CPz7779SsSL/6/YFK0AheJvq1asn5557boCrWDSewC+//GKMCByHx3Lt2rWyZMkStxgMi5133tndtxtIGIZlhrbeemvjJfMmHVyxYoVZk7xatWoyZ84cs0b5pptuKsuWLZO//vor5oXvTz/9JDBkMJYI1fzkk0+MDvvuu2+5EhmiHx999JGsXr1aatasKY0aNZLNN9/cqi9Lly6VDRs2yA8//GCO4aU0/o+3gv/n47P+w0jA88D3338ve+21l2y77ba2eNLPJ554Qm677TbB8ne1atVKWA5GHMKbq1SpYuqtXLlywnJ+Dn755Zemb9C1fv36rnc2/lp40r/44gv5+uuvzVgh3HrXXXdNaFhDP9wTGHOwhFcULxAylfPOO0/gMYf88ccfZinASy+9VHr16mV0wXEwxv244447YtfM98d9grWYN9tsM3PM+w88zxhvqx/uWyuZ3OP43V68eLHxaO+5555Su3ZtW13CTz9jmErHhJUmOYjvSbdu3cz9dOedd8rGG2+cpGSeD+tNSCEBEsgRAX0b52jYitOyZUtnzZo1OWqVzZAACRQDgXXr1jka0ucMGjSoGLoTqT7ow63TpEmTSOkUFWX23ntv59prr/Wlzt133+3oY23SPzXMYupRI8K5+OKLHZ1/bf5w7fbbb+/oNBm3nC7z5vTp08fR9clNvWpkOGq4Omq0OuppdIYOHeqW1TBfRw0/Rw1VR40TVw81YB01Kt1y3g2r84cffug97G7jvL4kcuuCjmpYO+qVdctgP1W/NUTYLYuNefPmOWq4m2vQd1x75plnOmoYx5SzO2pUOFdffbUpd+qppzpqqNtT7qcaWM5+++0XowcY6frMbhnvBnQG20SCccE4xPfpyCOPdDQyLOaSSZMmJSyr3uaYcrhODaMydeK7l4n07dvX1KUGZMzlmsTSHNcXIO7xk046ydGXFs7nn3/uqIHs6qARAI6+XHDL6QsP57jjjnPPo/94ZpswYYJbxt4v8Wzsfvw9/vTTTztbbrllTJ0nn3yyoy8/3Drthp8x9KOjrc9+Wp1T3eNqqDq6NJoTz9PW4edTX/w5zZo181M0cBlmaNA7jEICuSCA0F/9D1eQzfP111+XGjVq5KJZtkECJFAkBLp3726mEGAeGiVcAmoECDwnyC1AyZwAPDX6UGz+6tatKwceeKC7j+P64B9Tef/+/c08xKeeekqQhFANCpMUqFOnTjHrCWNOKDyWmG+KMMyzzz5bJk6cKKeddpo8//zzMXViDNu0aSOYXwgPIa6Fhw3Z+DMReEdHjx5tvJbwaiHkFN5VzFWF5xUyY8YM08+bbrrJ7D/66KMx/T700EPNcfwDXdq2bWs8i/Aewys4ZswYefjhhyVRmC6mDqEvWPrulltukccee6yMVxAJdvRFuKA+sISHFx5C6JOJxwwhx2CLfkFfZCBHUsjJkyfLrbfe6vZFjWHp2rWr6Qs8rBhDeAfffPNNUSPNLYcN6P7kk0+aP3hXwQ6e4LCTTcLbDYF31CtggvvxiCOOMN55NeLM/ebtjxqrZmkweLLhLYdHf4cddhA1eI23HvUFucfxrKfGqbRv397cDwgXR3u4h84//3yveuJ3DP3oGFOxjx2Ex7/66qsmrBpzry1DH5fmrkhgE5cXkAAJBCag4TuOhuc4xx9/vKM/6IGv5wUkQAIkAK8TPEuU7BCAF4tSlkAQD6v3ak3uYzw23mPebTUIjJdU1x73HjbeUX0KdtTAMcfhBdSQTEcf6B147XAOHjPIVVddZbxXZkf/gYcV59W4s4fMJ7yX8GTCOxUv6bxP8eWxj/rRjs6bjDn9yCOPmOOpvqfwKGsYqqPGb8y16BOeEzS02D2OPsOjrCGzzksvveQej9845ZRTjBc4mQctvjz2U3lYE5WHV1dftDvwslrRMFfTX4xDOunSpYuj4cnl8uB524j3sOL7q+tQm3Fu3bq1t6i5XzBeasDHHFej1kS84eDLL79s+qIvD2LK6BrXjoaoO/rCMOY4dtLd482bN3c0PNrRkOCYa/WFi2lLjXz3uJ8xzERHNOD3HtcQdWf33Xd39OWQYekq53Mjmx5WToTRO5hCAtkkgDfKeCOnP9YyduzYjN52ZlM/1k0CJFAYBDp06FAYihaolpkmsinQ7uZd7fnz54uGuRtvJTx3VjCnDmPhXWYGcw3hsbVzRPXlrymOpZwwdzRe4r2pGiprlo/DHEs11OKLp92H51DDeE1CJWzDWweBdzSovP3226Yv7733XsylmCcJbyo8bZgD+u677wr6ibmo8PRh7mMymTlzpvGw6suFZEUyOg5PG+bZwrOsNovRxdtnNW5EQ0CN9xTe8dNPP90klPTOQbYNwxML72/jxo2NdxGeR8w1Lq9em/6qAABAAElEQVT07NnT6IYoNugJTvBWxwvmuaphHXN4/PjxgvmlECRtgsC77xXMuUadmA8dRDCvF9EA8KTGe7k7duxovOpYJQJzfSF+xjBsHeP7g/FEGxibww47TO655x4zFzi+XD72abDmgzrbLBkC+NFE6BLSrCP8hA9EJTP07CgJkAAJkEAKAsioC9E5qGUSicG4gOFqJf7/zvh9Wy7Zp008hCRNQQUvnfF/OMJYYTQj4RO2MxX0G2Gz6lErUwWmCsFohcAwhHEMFt6kP/EXIZkQjFyEGYcl0AEGpnp1TTIoGPlgjqRW1sBCW3hhgGX5rr/+elHvsgm/RtlLLrlEkMjMa6jB+H7llVfkxhtvNOeuvPJKo/Ndd90l5TG0EcqP8YVjAC82EN6fyGBOdM/YjMnoCxhC3/hQZpxDQizvCxQcSycIpcbLFCy3Ey82wRYMbIjfMQxbx3i9sI8kVNAPuoNtVIRzWKMyEtSj6AjgR1jDkARzdEaOHEljtehGmB0iARIgARJIRQBeuWRiM+RjnqUmISzzN27cuGSXBj6OB31IgwYNAl0LvWAAIZMtDBDM04SnbdiwYSnrSddvzMeFsZKo33aZu4MPPth4u1DXAQccIFjjNZHAOINRZF8AJCoT9BgMUBirmP+7cuVKs148+o1MwfECAw/ZZeH91pBVY3xec801MmLEiPiiouHEZh6+htkaIxdedszvzeRFgq0cc5k18ZNpr0ePHgmNVVs21acmmTJGGvobL2DrNdS955ON9XbbbWcM+kTjYo/ZOv2OYaY6evVNtW3nV7/wwgtmjrhdqzjVNbk6R4M1V6TZTkkRuOGGG0TnqZjJ9TYJQ0kBYGdJgARIgARKmgCMKIS9IjQykSA0FEs0IUFRNgWeWiTRQVhnfCKedO0i2RC8nCeeeGKM5y0+nNfWY71ps2bNsofKfCKEFh5WLE2TTrCO7TvvvGPCbjWDq9x///0JL9G5kiakFCGmYQj6B0MUyZ6swMi0HkF7zPsJowuhrjAe4alESHMyQZgtjFokXIKBiFDtfAuWPoIgTNgrMKrBFYmT4iXVPQ6vOJY/gvEXb5DDGw1vumYmd6v0M4aZ6Og2kGYDIe/QAeOB8Opjjz02zRW5Pc2Q4NzyZmslQEDT/5vMfPiPhWv6lcCAs4skECIBvK1HtkZ4IigkUMgE8ICP+XDINgsvJTLrYh1T5HOAIPvqWWedZbIEoyzmzbVq1UqQeRbhlzB+rBc2KIcHHnjAzOmEBxOePtTn9VBibuYHH3xgql24cKH5RGgr5mEiJNJm4takOsaohoGBh3mExN57773GOEykEwwKrBc7fPhwM68SGVdhAMA4t95dhMLCe4wILGSfhTEM4wVeYISGYt8rOIc5vppkSLDmKDyd8Gh612NG5llkpMVKBAjFRYgtOE6ZMsWEXEMnCDyg9gUCPuHps5mbEU5r55RiLiN4wZOMMUHW3yFDhhj9vLrByNFER6Z/CAWGl1WX+zGeSmRq9grWj0VINdZChe7oB/J6wGto2/WWz/U2QpYxfhgfzK0+6KCDzPxdzHvFvYq1XeMl3T2O8GcYfvAiY1wQuox7CeOA+9KuH4t6/YxhEB393uNoG0Y67ke8TIHH2oYs41xkRP9zpJAACYREAJnykInwoYceCqlGVkMCJFAqBJDlUh/gTeZUXY6jVLrNfkacQKZZgnUOpqNJeEyGVX3oNVlR999//5jeqtHk6FIuDrK12jL4VEPVQcZSCLIEq+FntjVk0ZRTj6nZVy+dyaBrdvQfmyUYWYVRDz5xrXqMbBHzqcZCTHvetmvXrh1TVl8+O1WrVjXlsa6pGtaOGnNmf+rUqTFlsYN1STXU061fvY1lMvxiTXasx65eSbcc6sYaoqlEk+CYzLS6PEqZYuoVdZAdF/XY/qih7GAcrKjX1D1ny9hP9NMKOKvB6ZbFmrZYTxRjgeNWdE6qoy8i3HKoS40dR43bmGzHKK/GtFk317aHZyUNezZZoW19QT7jswSnuhYZmNXwT1XEnFMPsoNsxpYhsjljXVbwSCR+7nGswYtMwbbfYKkvLBJV5/gZQ786+r3HkZUamZ+RBVmjCRLq5fdgNrMEV4ASCpFCAiRQTgJ4C4c3ZA8++KBgHgWFBEiABIIQgLcCHhJk0oR3iZIfAgj/w5qXSJrnTRqTH23y3yq8g/DsYF5jJoLkLfAyqhGQMkMvvJdIZgRPndfzFKTNK664Qm6//XaTLAZeMswV9Xoig9TlLYs+wBuJeYkIffUj6AsSJ6E/6HsiQYZaZByG5w3hyn7qhhc2VTmEQIM3PLM22VSitv0cQ9IdcKxVq1bS4jAj0B76in7Ci5oowREqQBmsk4s69cWA8UYnrTiPJ+x4w/vr5zfAzz2OfoMV7od04mcMg+qYqs1091Sqa73n4J2GVx9h1GELQ4LDJsr6SpIAQj3wnyTCW5DWnUICJEACQQkg5BDzxOw8uKDXs3w4BPDQ/dhjj5nfcoTyUcpHAA/8fkJ7YbAFnWOaTDMYqZkavYnqRB8QyhpEdO1UwV8qgZ4IOw4iqYxV1IPMvTCswxAYvekEximMTz+inmrBX9Ql6Hj7ucfx8sSv+BnDoDqmajvdPZXq2lyd2yhXDbEdEihWAvaNLuak0Fgt1lFmv0ggNwRorOaGc6pWkLkTc9mQ7IZCAiRAAiSQfwL0sOZ/DKhBARO47LLLTHIFTKJHUgkKCZAACZBA4ROYMWOGVKlSpfA7UmI9wLIrHTp08BXGWWJo2F0SKGgC9LAW9PBR+XwSQMY4ZAJESn4aq/kcCbZNAiRAAuESoLEaLs9c1XbOOecIsv0i0y+FBEigeAjQw1o8Y8me5JDAJZdcInfffbeZ59S1a9cctsymSIAESIAESIAESIAESKB0CNDDWjpjzZ6GRKB///7GWMVC5DRWQ4LKakighAgMGjRIdOmrEuoxu0oCJEACJEACmROgwZo5O15ZggRuuOEGueOOO8xyB1jknEICJEACQQhgaRD8jiRb9iFIXSxLAiRAAiRAAqVAgCHBpTDK7GMoBDBfdeDAgaKLa8tpp50WSp2shARIoLQIYPmHUaNGSc+ePUur4+wtCZAACZAACWRIgB7WDMHxstIiMHr0aOnXr5/xrp577rml1Xn2lgRIIDQCSArTq1ev0OpjRSRQTAT++usv2WmnnWTIkCF57dbLL78sWDfzyiuvzKseuWgcfQXzuXPnZqW5//77Lyv1FkOlZON/FGmw+mfFkiVKAHNVe/fuLZh3hszAFBIgARIggdIgsGHDBhkxYoR8+OGHpdHhPPfScRxZvny5rFmzJq+aYFkj6DBlypS86pGLxteuXWuYr1u3LtTmpk2bJjvssIO8++67odZbLJV17txZjj/++GLpTtb7wZDgrCNmA4VM4IUXXpAzzjjDeFdhsFJIgARIgARKh8DGG28s9957r3mgHzp0aOl0vMR7etVVV0mtWrXkiCOOKHESmXf/u+++k2+//TbzCor8yvfff1922223Iu9leN2jwRoeS9ZUZARef/116dKli5x99tly++23F1nv2B0SIAESIAE/BE444QSZMGGC0GD1QyucMjYpGbycCxculAYNGkidOnXKVA7v4EcffSSrV6+WmjVrSqNGjWTzzTcvUw4H1q9fL1988YV8/fXXUqlSJRMGu+uuu8YkQPvhhx/kt99+M9cfc8wxUrVq1YR1eQ+uWrVKPv30U8HavXvttZdUrlzZezrQth8dbYU//vij6Tv63bBhQ9Mney7+MxMdYXCCL+bdV69e3a0SXvDPPvtMvv/+e9Pfbbfd1j2HjaVLlwoiE8ASAo85wqutYBz9cLXlvZ9ffvmlqR861K9fX3bZZRfv6Zjtf/75x4wL7iF4euvVqxdz3rvjhw/uiwULFsjWW29teG+yySbeKuSnn36S33//3bSDUN9PPvnE8Nt3333Flv3ll18EbUGgH/guWbLErQf35c477+zu2410Y42xQH077rijueTjjz82ujRt2rR41iTWQaeQAAnEEZg5c6aj//k43bt3d/SHJ+4sd0mABEggNQF9KE5dgGcLhoA+YDr60Fsw+oat6N577+1ce+21YVebsD59gHf0idu55pprHJ2C46jhavZxTJMexlyja6E7FStWdM+jjBoTzrPPPhtTDjuTJk1ytt9++5iyKK9GWUzZ008/PaaMvqyIOe/dUUPZ2W+//WLKb7rp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wQuPKANEooQtDAkOmyjrizyBBQsWmPCLXr160ViN/GhRQRKIHgEsW4OlMZIleImextQoLALdunUzoaVhGTth6VWM9cAYSmcAwlBTb1va7mO81OOWtlwmBWAIhZGsMaiOfvuOPoWlo+UDQwxh2X6levXqoay+gJcCQSTeqEx2rV8+MM7j56LG1wk2ftvFtRjH+LDi+DqDjHX8tcWyT4O1WEaS/fBFYMWKFXLsscfKgQceKBoe4usaFiIBEiABLwF42eANodHipVIa2/Bm4Y9CAukIxK/Hmaw8ypVawkesaaph0MmQuMeR9bhv377uPjdKlwAN1tId+5LrOdbxgrGKJADIOOgnVKPkILHDJEACvgjQWPWFiYVIoGQJINGPH1m7dq2fYkVVBtl9/fAppOc0LLGDLNbwhlLCJ0CDNXymrDGCBOAN6d69uyxbtsxkZQsaVhLBLlElEiABEiABEiCBiBJ44403IqpZ/tXClAr8FZMgA7E3C3Ex9S0KfaHBGoVRoA5ZJ3D11VebdVaRht4urJ31RtkACZAACZAACZAACZAACZBAuQjQYC0XPl5cCASwThsWwx47dqxgzTIKCZAACfghgOyS6bJf+qmHZUiABEiABEiABDInkDzHc+Z18koSiAyBWbNmCbIB9+/fX3r06BEZvagICZBAtAm88847JhHKkiVLoq0otSMBEiABEiCBIidAg7XIB7iUu/fll19Kp06dpGPHjsbDWsos2HcSIAH/BGCkHn744Wb5knr16vm/kCVLigA88L///ntJ9ZmdJQESIIF8EKDBmg/qbDPrBLBANTICY322xx57jMtPZJ04GyCB4iGAee6DBw822cQZElw84xp2T/bdd1+5/fbbw66W9ZEACZAACcQRoMEaB4S7xUHgzDPPlFWrVsnzzz8vVapUKY5OsRckQAI5IYBlCbD2X6VKlXLSHhspTAItW7aUKVOmFKby1JoESIAECogAky4V0GBRVX8E8MZ7woQJgozAO+ywg7+LWIoESIAESIAEAhDo2rWrbLvttgGuKMyiG220kdx6660yfPjwwuwAtc4KgXXr1pnoNb7YywregqwU90Tjxo2zonsFXZ/SyUrNrJQE8kBg6tSpZu7ZbbfdJv369cuDBmySBEiABEiABIqHABKQLVq0qHg6xJ6UmwCmXeEZq2LFijJ06FCpXLlyuetkBcVBoFGjRrL//vuH3hl6WENHygrzRWD58uWCN96dO3emsZqvQWC7JEACJEACRUWgRYsWgj8KCVgC8LhD/v33X1m7dq1ccMEF9hQ/SSArBOhhzQpWVpprAn///be0bt1a1q9fL3PmzJHNN9881yqwPRIggQIj8OmnnxoPQf369QtMc6pLAiRAAvkhsGHDBqlbt6788MMPRoGaNWvKt99+K5tuuml+FGKrJUGASZdKYpiLv5PnnXeeLF261MxdpbFa/OPNHpJAeQlg6ZqDDz5YrrzyyvJWxetJgARIoGQIvPDCC66xik7//PPP8vDDD5dM/9nR/BCghzU/3NlqiATuu+8+E47y0ksvmTVXQ6yaVZEACRQpAWQSx7w8ZHmtXr16kfaS3SIBEiCBcAm0atVK5s6dK/C0WkGCy6+++kqQYZ1CAtkgQIM1G1RZZ84IIPy3bdu2cs0118jAgQNz1i4bIgESKGwCyGaIPxqrhT2O1J4ESCB3BD788EPZZ599yjRYoUIFefzxx6Vbt25lzvEACYRBgAZrGBRZR14IIAylSZMm5sfzxRdfNOnV86IIGyUBEiABEiABEiCBIidw1llnyaOPPir//POP8abCUEXiJSx91KBBA2aTLvLxz2f3OIc1n/TZdrkI9OzZU7Aq07hx42isloskLyYBEiABEsiUwIoVK+Swww6TL7/8MtMqeB0JRJ4AnASPPfaYMVZhqCIkGMYqlrb577//ZPHixfLKK69Evh9UsDAJ0GAtzHErea1HjBghkyZNkvHjx8tWW21V8jwIgARIgARIID8EkCV11qxZMn369PwowFZJIAcERo8e7c5bhcHavHlz2WWXXWTrrbc2Riu8rNdff30ONGETpUiABmspjnqB93n+/PlyxRVXyODBg81SNgXeHapPAiRAAiRQwAQqVapkcil89913BdwLqk4CyQnAmzp8+HDXYH3ggQdMlnU4DN58802pWrWq8bIiGRNe3lBIIGwCNFjDJsr6skrg999/ly5dukibNm24HEVWSbNyEih8At9//70ce+yxgk8KCWSTAEIhmfgvm4RZdz4JeJeyueqqqwRzWTfZZBMTHtywYUOZOnWqVKlSxah444035lNVtl2kBGiwFunAFmu3zjnnHPnjjz/MPAqEn1BIgARIIBGB5cuXS/v27QXrrSJ8jUIC2STAeyybdFl3vgkMHTrUqHDyySeLNUgxdxVzWCHNmjWTyZMnC6INXnvtNUE2YQoJhEmAT/xh0mRdWSUwZswYeeqpp0yGutq1a2e1LVZOAiRQOATw0PT+++8LwtR69eole+yxh9SrV89krpw2bZrw96JwxpKakgAJRIsAjM+3335bWrZsKY888oj7AtB6WK22Bx10kEyYMMH87t588832MD9JIBQCFUOphZWQQJYJfPLJJ9KnTx8ZMGCAHHrooVlujdWTAAlEmQAWqJ89e7a899575hMPVPHLLMDjdeaZZ0qdOnWi3BXqRgIkQAKRJrBo0SJp3LixvPzyy7Lpppu6ujZq1EgOOOAAdx8bHTt2NMkw582bF3OcOyRQXgJch7W8BHl91gn8/fffJhvdFltsIW+99ZbJRpf1RtkACZBAJAl88803stNOOxndEJIGQzWZvPHGG9KhQ4dkp3mcBEiABEiABEigAAjQw1oAg1TqKsKr+u2335r1vfCASiEBEihdAvCqYv1lSCpjFeebNm2KDwoJkAAJkAAJkEABE+Ac1gIevFJQHeva3XXXXeZvxx13LIUus48kQAIpCCxYsMAk9khRxJzCvFWu0ZyOEs+TAAmQQGYEZs6cKZdeemlmF/MqEghIgAZrQGAsnjsCv/32m/To0UM6deokp59+eu4aZkskQAKRJYC5Uek8q5i/ut9++0W2D1SseAng/kSCGgoJFDuBTz/9VB588MFi7yb7FxECjK+MyEBQjbIEkGRp3bp1MmrUqLIneYQESKAkCcAgsCHByQAge2Xz5s2TneZxEsgagWHDhsmaNWvMEh9Za4QVk0AECMRnCY6ASlShiAnQw1rEg1vIXZs4caKMGzdORo8eLTVr1izkrlB3EiCBkAisXLlSVq9enba29evXc/5qWkoskA0CLVq0kHfffTcbVbNOEogUgW7dupn8IpFSisoULQF6WIt2aAu3Y6tWrZJzzz3XLElxzDHHFG5HqDkJkECoBLDWql9hwiW/pFguTAInnHCCWQf4v//+M+tRhlk36yKBKBHAEjfeZW6ipBt1KT4CNFiLb0wLvke9evWSzTffXIYPH17wfWEHSIAEwiNgEy7Bg5pKsARW3bp1UxXhORLICgHcd7z3soKWlZIACZQwARqsJTz4Uez62LFjzeLUyA5crVq1KKpInUiABPJEYP78+fLvv//GtL7xxhsLkizhOD53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KRYKQYsGTXDmW+/+uqczc4/MnHv8/tbznJyRPVvePedm1qy11yIdUTOXS3Q7V42vOQRYEsBae54PJSLQSALKw9pIul1WNzn8CJrRLWtYu2x6NBwREAEREIEOI0A6IoLvEQhLIgKdRmDCCSd0a6yxRlOCKHYaG/W3vgRkYa0vz66uDYWVoBnJHI1dPWANTgREQAREQAQaSAB3StwqJSLQiQQIaoY7u0QEGk1AFtZGE+6i+t98803vspRN39FFQ9RQREAEREAEREAEREAEREAE2oiAFNY2mox27wrrV2edddZ276b6JwIiIAIiIAIiIAIiIAIi0CUEpLB2yUQ2YxhYWGebbbZmNKU22pjAN99842aZZRZ33HHHtbSXt9xyi5tyyindwQcf3NJ+NKNxxgrzxx9/vCHNsTa9VdLKtns75kb/Fj777DO35557urnmmstNOumk/h446aSTetttXS8CIiACIiACHUVACmtHTVdrOyuFtbX826X1KIrc22+/7XiYbqU8+OCDvg9E2Ox2GTNmjGde70iMw4cPdzPNNJN74oknmo6wlW3Xa7CN/i1ssskm7rzzznOLLrqoO+uss9xuu+3myD0rEQEREAEREIG+REBBl/rSbPdyrLgEy8LaS4i6vG4EDjnkEDfddNO5Nddcs2519rWK3nvvPffuu++2ZNitbLslAy7YKEHu7rnnHrftttu6v//97wWvVnEREAEREAER6B4CUli7Zy4bOpIPP/zQ4f6mNawNxdxRlY8zzji+v1han332WffrX/+6bB7BN954w/373/92WKQGDhzoSOVQSr7//nv3+uuvu7feessRLh83WCxKoS2uIf1DiKo5ePBg179//1JVpY599NFH7pVXXnH9+vVz8803n5tkkklS54vuUB8KBf2YeuqpfaqnAQMG9Kjm448/di+88EJchjGVkx9++MH3EZ5YPfO8HELpw/o6/fTTu2z79O3pp5/26QZIRUU0xyDMBfkfQyoNLOa4VwchH2QerqF88rvaHBZpm9yUcJl55pl9Ey+++KL76quv3CKLLOImnnjiZLN+m/vr1Vdf9Tktmedpp522RxkOVLsf33//fX//kW7kn//8p1tmmWUcweZ4acffwXnmmSdVb7g/K/0WPvnkEzd69GgfZT2Up5J33nnHpwvjXk/KyJEj/e7aa6+dPKxtERABERABEeh7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efNdqFIiIAJNIfDnP//ZnXHGGe61115rSntqRAR6S+Dkk092l112mXv22Wd7W5WuF4GyBLSGtSwanQgExo4d6/r16xd29S0CItChBPBKwLVxggkmcJdffnmHjkLdFoHuJTD55JO7UaNG+d9p945SI+smAj///LPDsCERgUYSkMLaSLpdUvd3333nJp544i4ZjYYhAn2TwGOPPebeffddP/gffvjBobxKREAE2ovA3HPP7dZcc03Hi2KJCHQCgTnnnNMNGjSoE7qqPnYwgXHsbfv/j8DRwYNQ1xtHgAfbCSec0N14441uvfXWa1xDqlkERKChBPbaay/3l7/8xfGbDoISu9RSS4VdfYuACIiACIiACIhA2xGQhbXtpqS9OvTtt9/6Dk000UTt1TH1RgREIDeBn376yV166aUpZRW34CuuuCJ3HSooAiIgAiIgAiIgAq0gIIW1FdQ7qM2gsMoluIMmTV0VgQyB4cOHu9GjR6eOYmlFiWX9kUQEREAEREAEREAE2pWAFNZ2nZk26RfrVxEprG0yIeqGCNRAgABLWFSz8umnn7r77rsve1j7IiACIiACIiACItA2BKSwts1UtGdHZGFtz3lRr0QgLwFeOl1zzTUpd+BwLUos6QgkIiACIiACIiACItCuBKSwtuvMtEm/vv/+e98TAi9JREAEOo/Abbfd5saMGVOy47gFX3311S54UpQspIMiIAIiIAIiIAIi0EICUlhbCL8Tmg7r28YdV7dKJ8yX+igCWQKsUx1//PGzh+N9lNnbb7893teGCIiACIiACIiACLQTAWkh7TQbbdgXKaxtOCnqkgjkJEAy95tvvtn9+OOPZa9AmUWplYiACLQHgQ8++MC78bdHb9QLEahM4OOPP3Z48oTnxcqldVYEaiMghbU2bn3mKtJhILKw9pkp10C7iAD5k5N5V0sNDWUWpbac23Cpa3RMBESgcQSefvppt8kmm7ivv/66cY2oZhGoE4ERI0a4ddZZx40dO7ZONaoaEehJoLyfWM+yOtIHCYQ3ZlJY++Dka8gdT2CWWWZx66+/furN95tvvukGDBjgpppqqnh8k002WbytDREQgdYS+OUvf+k78P7777u55pqrtZ1R6yJQhUCIQF/Jk6dKFTotAlUJSGGtiqhvFwgK63jjjde3QWj0ItCBBAYNGuT4JGXuued2a6yxhjvssMOSh7UtAiLQJgQGDhzorrzySjfddNO1SY/UDREoT2C++eZzF154oZtkkknKF9IZEeglASmsvQTY7ZcHhVUW1m6faY1PBERABESgHQj079/fbbrppu3QFfVBBKoSmGGGGdzvfve7quVUQAR6Q0BrWHtDrw9cK4W1D0yyhigCIiACIiACIiACIiACbUpACmubTky7dCtYVkPwpXbpl/ohAiIgAiIgAiIgAiIgAiLQ/QSksHb/HPdqhGHtqhTWXmHUxSIgAiIgAiIgAiIgAiIgAjUQkMJaA7S+dAk5GhEprH1p1jVWERABERABERABERABEWgPAlJY22Me2rYXsrC27dSoYyIgAiIgAiIgAiIgAiLQ9QSksHb9FPdugFJYe8dPV4uACIiACIiACIiACIiACNROQApr7ez6xJVSWPvENGuQIiACIiACbUTg+eefd2uttZYbM2ZMG/VKXRGBngS++OILt8MOO7jXX3+950kdEYE6EeiRh/W7775zRx11lP5I1glwp1fz+eef+yEcf/zxbppppun04aj/dSYwzjjjuB133NHNO++8da5Z1YmACIhA3yXw448/ujvuuMP95z//cQMHDuy7IDTytieA3vC3v/3NbbPNNrpX2362OreDPRTWUaNGOZSTRRZZxE066aSdOzL1vG4Ell9+effOO+/4T90qVUVdQWDEiBGOpOFSWLtiOjUIERCBNiHA39V+/fq50aNHt0mP1A0RKE0gBOf84YcfShfQURGoA4EeCmsURb7aYcOGuQUWWKAOTagKERCBbiUwxxxzuPA3o1vHqHGJgAiIQLMJoLDKHbjZ1NVeLQSmmGIKh1uwjFy10NM1eQn0UFjzXqhyIiACIiACIiACIiACIiACfZcAS4MGDBjQdwFo5E0hoKBLTcGsRkRABERABERABERABERABERABIoSkMJalJjKi4AIiIAIiIAIiIAIiIAIiIAINIWAFNamYFYjIiACIiACIiACIiACIiACIiACRQlIYS1KTOVFQAREQAREQAREQAREQAREQASaQkAKa1MwqxEREAEREAEREAEREAEREAEREIGiBOqusP78889F+9CU8uQRnWWWWVKfV155pW5tt+u4991339SYd95557qNua9WpLnuqzOvcYuACIhA8wj89NNP7r333mteg2pJBERABNqUQF0V1o022sitv/76bTnUX/ziF+6AAw7wnyWXXNK9/fbbrh5JjocPH+5mmmkm98QTT7TluNdee+143J9++qn7+OOP27Kf1Tr11Vdfuemmmy7+zDzzzG7ZZZd1xxxzjGNczRDNdTMoqw0REAEREAEI3H///W7GGWds2v9xoi4CtRL49a9/7c4777xaL9d1IlCVQF3zsD7zzDNuzjnnrNpoKwqQI2r33XePm7722mvj7d5s8Pbz3Xff7U0VVa+NosiR56oWWW211Rwf5Mgjj/TfnfgPVs2PPvrIrbjiim6DDTZwH374obvjjjvcEUcc4S699FL3z3/+00055ZQNHVoz5ro3Aygy1725p3rTR10rAiIgAiKQjwAvaRH+v5tqqqnyXaRSItACAmPHjnV8JCLQKAK9Vlg///xzr0jQQSyWY8aMca+99lrc3wknnNDNOuus8T4bPCy/+uqr7j//+Y+bb7753LTTTps6//777zuum2yyybwisswyy7iJJprIjRo1yn3zzTdunnnm8eWpZ+TIkW766af3SYtHjx7tnnvuOcebnl/+8pepOovuvPHGG+7f//637+vAgQPd7LPPnqqCc7jrfPDBB/44FtukwkT7/fv3T13z5Zdfuqefftr/xzP33HO7CSaYIHW+1M7ll1/uTjrpJHfnnXd662K2DMxxbf7ss8+8pXe22WbLFsm9z9y98MIL/m3u1FNP7eaff3436aSTlrz++++/d6+//rp76623/Fzhbj3HHHP0UKzzlivZSImDiyyyiNtrr738meOOO8798Y9/dIcddpg7++yz3eGHH+6P0yb3Cm+m+/Xr57DOjhgxws8h/czKjz/+6F5++WVvfZ533nn9/ZQsU8tcY8mGJRyZa+7ncpJ3DovUWa4tjqP8b7755v5+Ou2009x4441XqbjOiYAIiIAItIAA/4ftsccePZ4lWtAVNSkCFQmstNJK/hm0YiGdFIHeEDClLyX24B5ZfdHzzz+fOl5u56yzzvLluabUxxTS1KWmOESmwPqy4447rv/efvvtI1OW4nIbbrhhtOeee0b2A/DnTUmJzIIWmdIamaUxOuWUU3xZrqFNU1ai/fbbz58LfTDlJa4vuxH6XGqMpjxEv/rVr3y9oS6+11prrcjeHsVV2dvOHmWS5a+55pq4LHWakhUx3jBm2rjnnnviMtkNUyqioUOH+ja23HLLyBT1VBHqNGUtmnjiiVP9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YSx8RK/FjRbhOtbV8sEqXtS6HOrIM4e+wTr+wz2GWzP3BlywwlcK5hQYYZmvdE/SxZ9//tnXDa+iludSQ2TtMC5g1IWlO/AvVZZjrIdmXMw1Y2uWsKZ3yJAh3sLcrDbVTu8IEAeAN+EEUJOIgAh0BgG8eVgKVCooX2eMQL3sZgIsreK5kMCalpawm4eqsbWIQNu4BKM4lFKsslxQHHD1rSZmiXV8GiEhaFI96kaZziMoQkUETgTxKSfVOOKmTGArglcllaVkvWENZbk2yh2v1na563p7nHssL2/aKtJPXjjwEqVegis7LtR5xazOjo9EBERABESg+wisvvrq3TcojahrCLB0jmCWEhFoFIG2UVgbNcBm1Xv77bf7VDrV2sMitffee1cr1vLzWPVYM8u41lxzTbfwwgt7KzWBk6677jq32mqrucGDB7e0n9ncveU6QznW4EpEQAREQAREQAREQAREQAQ6i4AU1jrNF646BGGqJljOOkWIDkwQIAJR3X///d7SSlobAl9tvPHGVd1kGz3OPLzpw5gxYxrdFdUvAiIgAiIgAiIgAiIgAiLQAAKdoz01YPD1rJI8pXy6SXCpJh0Qn3YUFGmJCIiACIiACIiACIiACIhA9xJoyzys3YtbIxMBERABERABERABERABERABEchLQAprXlIqJwIiIAIiIAIiIAIiIAIiIAIi0FQCUlibiluNiYAIiIAIiIAIiIAIiIAIiIAI5CUghTUvKZUTAREQAREQAREQgRYROPjgg91jjz3WotbVrAiUJzB27FifVYKc8BIRaAQBKayNoKo6RUAEREAEREAERKCOBC688EI3YsSIOtaoqkSgPgQ++OADt/baa7uRI0fWp0LVIgIZAmWjBP/tb39z0003Xaa4dvsqgW+//dZ9/fXXjvysEhEIBD7//POwqW8REAEREIEGEphiiincZ5991sAWVLUI1EZgggkm8Bf++OOPtVWgq0SgCoEeCuu0007rFlxwQXfLLbdUuVSn+xKBDz/80OHyQR7WcceVYb4vzX2lsU455ZRuvvnmq1RE50RABERABOpA4IEHHnADBgyoQ02qQgTqS2CqqaZyeADMPvvs9a1YtYnAfwn0UFh5AH3uuecESARiAu+9955XVH/++WfHGpohQ4bE57QhAiIgAiIgAiLQeALyems8Y7VQG4F+/fq53/3ud7VdrKtEIAcBmcpyQOrrRc466yw3zjjj+M8JJ5zgoijq60g0fhEQAREQAREQAREQAREQgSYQkMLaBMid3ATrVs8++2zHugQU1TfeeMPdeuutnTwk9V0EREAEREAEREAEREAERKBDCEhh7ZCJalU3Cb5FwKUg4403nsPKKhEBERABERABERABERABERCBRhOQwtpowh1c/08//eROPvlkx3cQth955BH39NNPh0P6FgEREAEREAEREAEREAEREIGGEJDC2hCs3VHp9ddf7wi4lJXxxx/fK7LZ49oXAREQAREQAREQAREQAREQgXoSkMJaT5pdVheuvyGFDa7AQVjPevXVV7t33nknHNK3CIhAhxAglyNB1CQiIAIiIAIiIAIi0AkEpLB2wiy1oI8PP/ywd/sllQ0WVR5wQ2JouoMie8YZZ7SgZ2pSBESgVgJPPPGEe/zxx91ll13mvv/++1qr0XUiIAItIMD/y9NOO6374osvWtC6mhSBygR23nln9+CDD1YupLMiUCMBKaw1guv2y0466SSvlKKszj///G6PPfZwc889tzvkkEO88oqV9S9/+Yv76quvuh2FxicCXUHgu+++c1tuuaX//Y4cOdIdc8wxXTEuDUIE+gqBCSec0H388cfu888/7ytD1jg7iMBVV13lXn311Q7qsbraSQSksHbSbDWpr6+//rq75ZZbHNbVGWec0d11112uf//+vvVjjz3WbbPNNn577Nix7vzzz29Sr9SMCIhAbwgcfvjh7s033/S/a4KnHXfccQqe1hugulYEmkxguummcyussIJyoTeZu5rLRwAvvB9++CFfYZUSgYIExrHcmlHBa1S8ywnsuuuu3no61VRTuSeffNLNNttsjofdG2+80T3//PM+J+vgwYPdHXfc4aaffnq/lhVLrEQERKA9CeAKvPTSS6cedFmXPuecc7rnnnvOYbmRiIAIiIAIiECtBDBiTDTRRC4Z86TWunSdCGQJyMKaJdLH9z/99FN34YUXun79+rl77rnHK6tZJCin1113nVtsscXcBx984K699tpsEe2LgAi0CYHgChwCqIVuYWWVa3CgoW8REAEREIHeEOC5Ucpqbwjq2koEpLBWotMHzxGMBVfgm2++2S288MIxAR52kw+8/GG688473RxzzOH++te/xuW0IQIi0F4EjjjiCO8KnMynHHoo1+BAQt8iIAIiIAIiIALtSkAuwe06My3q10cffeTeeustt8QSS6R68OGHH/qcrIsuumjq+H/+8x9vZV1kkUVSx7UjAiLQegKlXIGzvZJrcJaI9kVABERABERABNqJgBTWdpoN9UUEREAE6kSA4BfzzjtvWetqshmU1qFDh7qjjjoqeVjbIiACIiACIiACItByAnIJbvkUqAMiIAIiUH8CpJx69913XSlX4Gxr5FkmoJpEBERABERABERABNqNgBTWdpsR9UcEREAE6kBgyimndH/605983tVq1ZGO4IwzzqhWTOdFQAREQAREQAREoOkEpLA2HXlnNvjGG2+4xx9/vDM7r16LQB8lQIqq5ZZbzlVKO4V19fTTT3czzzxzH6WkYYtA5xB45ZVXfCqqzumxeioCIiACvSegNay9Z9gnakjmYe0TA9YgRaBLCPCyibWspLfJCors8ssv7+67777sKe2LgAi0IYHtttvOffzxx+7WW29tw96pS32ZwJprrunmmWced9ppp/VlDBp7gwjIwtogsKpWBERABNqBwOyzz+5OOeWUkq7BuAIPGzasHbqpPoiACOQgMGDAAPfll1/mKKkiItBcAj/++KP75ptvmtuoWuszBMbvMyPVQHtFYN1113ULLLBAr+rQxSIgAq0hgGvwlVde6R577DHHQwUiV+DWzIVaFYHeENhss83cqquu2psqdK0INITAsssu66addtqG1K1KRUAuwboHREAERKAPEEi6BssVuA9MuIYoAiIgAiIgAl1CQAprl0xkXxwG6Tq+/fbbvjh0jVkEaiJw7rnnuv33399NMskk7umnn3YzzTRTTfXoIhHoawTwSOjXr19fG7bGKwIiIAJtQUAKa1tMgzpRC4FBgwa5hx56qJZLdY0IiIAIiIAIFCLAC5+ddtqp0DUqLAIiIAIi0HsCWsPae4aqoUUEPvnkE7fVVlu5LbbYokU9ULMiIAIiIAJ9gcCQIUN8dN6+MFaNUQREQATajYAU1nabEfWnEIE555zTrbXWWoWuUWEREAEREAERKEJg0kknLVJcZUVABERABOpIQGlt6ghTVYmACIiACIiACIiACIiACIiACNSPgBTW+rFUTSIgAiIgAiIgAiIgAiIgAiIgAnUkIIW1jjC7uaqbbrrJHX300d08RI1NBERABERABNqawNdff+2233579/LLL7d1P9W5vkfgpZdeco888kjfG7hG3BQCUlibgrnzGxkxYoS79tprO38gGoEIiIAIiIAIdCiBcccd11100UWOvMoSEWgnAhdccIE74IAD2qlL6ksXEZDC2kWTqaGIgAiIgAiIgAh0LwFywaK0YmmViEA7ERh//PHdDz/80E5dUl+6iIAU1i6azEYO5ZBDDnEPP/xwI5tQ3W1G4Oeff26zHv3/7uy7775ulllmiT8777xz3frZrmN+55134vGGsb/yyit1G3dfrEhz3RdnvTvG/Pnnn7uNN964OwajUXQNgc0331xLx7pmNttvIEpr035z0pY9mnjiiR0fSfcTGD58uNt2223dNddc45Zeeum2G/Daa6/tZp99dt+vgw46qG65ETfaaCP3/fffO9Zrt5v84he/iF2tHnjgAe+e36lvsr/66is3cODAGPFEE03kZpxxRp+eatddd3VTTTVVfK5RG5rrRpFVvc0gMNlkkzWjGbUhAoUILLLIIoXKq7AIFCEghbUILZUVgT5A4L333nPvvvtu2450tdVWc3yQI4880n/X459nnnnGkde3URJFkRtnnHFqqn7AgAFu9913j6/t5PXkWDY/+ugjt+KKK7oNNtjAffjhh+6OO+5wRxxxhLv00kvdP//5TzfllFPGY23ERqPnujd97qa57g0HXSsCIiACIiACgYAU1kBC3yLQxwn8+9//dj/99JP74IMPPIm33347pTj88pe/dP37909R+vLLL93TTz/trWJzzz23m2CCCeLzWCtHjRrllcCRI0c6FLZf//rX7scff3SPPvqoW2qppRzWNeSTTz5xWN5mm202h0Lzr3/9y40ZM8YttthiqTrjynNuUMcLL7zgPv30Uzf11FO7+eef30066aTx1bjWoTwhWCwp/9prr8XnJ5xwQjfrrLPG+2Gj0rhDmeT36NGj3W9/+1u33nrrub333jt5Kt6mfdx8P/vsMzfTTDN5FvHJghvVxp2sjvEzZsYEI+YRpSkrzOfrr7/u3nrrLQcXXJPnmGOOmpVw3sbvtddevpnjjjvO/fGPf3SHHXaYO/vss93hhx/uj//nP//x8zLzzDP7/RdffNHfJ1xbyuODe4voqR9//LGbd9553fTTTx8Po9a5pi7uocCGsZcTWDKHrDOcb7753CSTTNKjaKU+9iisAyIgAiIgAiIgAo6HSIkIdCSBeeaZJzrqqKM6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cCeffLIPwoNFa8opp/RWv1JlixxjHSIWWNYQ4q6UR8LaRcbLmMpJ0XHjKlWtD1jmKMf4WadWq+QdN3NL/luYm+LrLeul2uS/CazslIcLQaza1YrHeOhvpbkLY8wz14EllmfcoCsJbuxwwg05BAwrVb5IH0tdnz2Gp4G9nHG4ihIxWVJ/AniXWDoj7zpf/9pVowiIgAiIQCUCcgmuREfnRKCPExgwYIDjU0lYX1p0jWm5+nBNrVXpLVUnCgYur0WEa/K4NBcddzVllT7Wa+x5x42Sw6eaoJyi0HaCoOznlTxznZclbfKSgZcj1aRIHyvVxQsEXMQJiEV06j/96U+ViuucCIiACIiACHQkgdpf4XfkcNVpERABERABEegOAqxdZd0ukbAffPBBt+qqq3bHwDQKERABERABEUgQkIU1AUObIiACrSEwcOBA/7CNNUsiAiKQj8DgwYPdmDFjeuU+nq8llRIBERABERCB1hGQhbV17NWyCIjAfwkQDZeot0S8lYiACOQjwHri3qx1zteKSomACIiACIhAawlIYW0t/45p/Y033nCPPfZYx/RXHRUBERABERCBbiRAkDRSZJF2SyICIiACfYGAFNa+MMt1GOPf//73OCdkHapTFSIgAiIgAiIgAjUQ+Oqrrxy5gi11WA1X6xIRaAyBF1980UeRJ2e1RATqTUAKa72Jqj4REAEREAEREAERaBABy4vsax47dmyDWlC1IlCcADEoSLFFajaJCNSbgIIu1Ztol9a37rrrugUXXLBLR6dhiYAIiIAIiEBnEGCt/8UXX+wWXnjhzuiwetknCJCWjWfFPKnS+gQQDbKuBGRhrSvO7q1s8cUXdxtttFH3DrCOI3vnnXfcLLPMkvq88sordWyhtVXx9jSKoh6daOW4Seex+eab9+hTJx44/vjj/b3zzTffdGL327LPP//8c1v0a7XVVnObbLJJW/RFv9e2mIaaOkFe5K233tr96le/qul6XSQCjSBA/nLWVs8666yNqF519nECsrD28RtAw68/Ad4yHnDAAb7iBx54wF177bUd7yLDmqmhQ4e6++67z7388ss+Muk888zjDj/8cPfb3/7Wj7WV437//fdLKtH1n93G1/jZZ5+5t99+27WLktX4ETe2BV604aZ20003NbahHLWTL5W+tIPo99oOs6A+iIAIiIAI5CEghTUPJZURgQIEBgwY4Hbffff4ChTWTpZ///vfbs0113Rvvvmm23TTTd3vf/97x9qpJ5980j366KOxwtpt4+7kOVPf/0fgmWeecXPOOef/DmjLE9DvVTeCCIiACIhApxCQwtopM6V+thUB3GJx88UaNtNMM7nZZput5v6NGTPGvfDCCz5FwdRTT+3mn39+F4JqZCvFOvP666+7t956y0044YTedXSOOeZwuIglJW+55DXltvfZZx/f3p133ulwvU3KTz/9lNwttP3jjz96a+3HH3/s5p13Xjf99NNXvP6jjz7yzPv16+fmm28+N8kkk1Qs/+2333pL5QQTTNCr+anYSI0n844Ft2BeCnA/LLLIIj4CY2iSOR41apSbccYZHUywgo8YMcLNPvvs/r4I5ZLfsOZe4z6be+65/T0UzuPmPXLkSD8PKDPc39xnlMPFvZQUmUNeeHzyySduiSWWKFVVfIx76sEHH/Tr86aYYor4eHaj0j3++eefOxgj/Fb5jb322mtxFfx2Srmtffnll+7pp592U001lR83905WivxeuZZ+wHXKKad0yd8LbX3wwQdu2mmndZNPPnmqmTC3jH+aaaZJnSuyk/c+y1NnkbmmvqJtt/PvNQ8flREBERABEWggAXtIkYhARxIwl9ToqKOOamrf7eE3+uMf/xhZ0AsWccafgw8+uGQ/zjrrLF/G0g+UPT/++OPH9VCnPSxHZpXtUf7WW2+NbM1Sqizl33vvvVTZvOVSF5XZeeKJJ3x7O+64Y5kSpQ9XG/fVV18d2cN4aiy2ti+yvII9KjQFKzIlJ1V2ookmir744ou4rClV0corrxzvmwXY75tiEt1www3x8VZv5BmLuZP7sd5xxx2RKTPxuLnfzaU0HsK//vUvf+7mm2+OjjzyyCjcR/byIjruuOPicmyYohitt956cV3cN6YIRddff31czhQxf/7MM8+MNttss7jsuOOOG5144olxubBRZA7ffffdyJRqXyfXVZI999zTl7OXGGWLVbvHw/2X/I0mt+2FR6puftd77bVXxFj5UJbf2j333JMqR72Bc6iv3O/1qaeeihZaaKGYYyi/wgor+DpNiY2YK1hn5aKLLvLXXX755dlTufbz3GfJigKvcn+nisx1nrY75feaZDTXXHNFxxxzTPKQtkVABERABJpEQEGX7ClCIgJ5Cey///7u0EMPdVtuuaXD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vn0VpZ5JJQESIAESIAESqEcCnMNaj0+deSYBEqg7ArCu9u/f3+S7QYMG6uabb647BswwCZAACZAACZBA9RGgwlp9z6wiKX766afVZZddVpF786YkQALFE3jsscfU1KlTTUQLFy5UgwYNUn/++WfxETMGEiCBihD48ssv1YEHHqimT59ekfvzpiQQRmDkyJHqiy++CDvFYyRQMAEqrAWjq68L3333XfXII4/UV6aZWxKoIQJXX321wqLuVubOnasGDx5sd/lLAiRQZQR+/fVXNXToUHY8Vdlzq/Xk9u3bVz3wwAO1nk3mr8wE/mm9lPnGvB0JkAAJkEB5CMA52fvvv6/+/vtv74bYxhBhDBWmkAAJVB8B2wHFOlx9z66WU9yoUSP1119/1XIWmbcKEKDTpQpAr8ZbwhqDFxCWw6CQAAlUF4GePXuqF154QWEocFCGDRum9t9//+Bh7pMACZAACZBAbALPPfeccei3wQYbxL6WF5BAFAEqrFFkeJwESIAEaoDApEmTVOfOnZXfITwsM7Cw4nf99ddX7733Xg3klFkgARIgARIgARKoRQIcElyLT5V5IgESIIH/IzBgwADVsOE/S243adJEYcgWjkFpHT9+vHrjjTfIiwRIgARIgARIgARSSYAKayofCxNFAiRAAsUT+OWXX4xjJTuf6JprrlEdO3ZU/fr1U+utt55RWmFltcvdFH9HxkACJEACJEACJEACyRKgwposT8ZGAiRAAqkhcOutt6oFCxaY9Jx88snqrLPOMtvNmjVTL774ourQoYOxsj7zzDNq8uTJqUk3E0ICJEACJEACJEAClgAVVkuCvyRAAiRQQwTmz5+vbrjhBpMjOFW68cYbM3K3zDLLqFdffVUtt9xyZn4rhg5TSIAESIAESIAESCBtBKiwpu2JMD0kQAIkkAABrIM3c+ZMtc0226j/9//+n2rQoEFWrLCwQmldcsklzdBhhKeQAAmQAAmQAAmQQJoIUGFN09NgWkiABEggIQJ333236tKli8Jw38aNG3uxYs3GefPmeftdu3ZVWIYAXoSHDh3qHecGCZBA+gn4vX+nP7VMIQmQAAkURoAKa2Hc6u6qq666SnXv3r3u8s0Mk0C1Erj99tvV66+/rpZeeumMLGAt1mAjF1bYd955Rx100EEZYblDAiSQXgJff/21WZoKdZdCAmkhcNttt3nTUdKSJqaj+glQYa3+Z1iWHMydO1fNmjWrLPfiTUiABIonAOsq5qkGBcvaLLHEEsHDat1111UtW7bMOs4DJEAC6SRgh/kHO6DSmVqmql4IjB071kw1qZf8Mp/lIfDP4nzluR/vUqUEVl11VbXZZptVaeqZbBIgAUugb9++Rjm1+/wlARKoTgJLLbWU6t27t2rdunV1ZoCprkkCWOcbI3koJJAkgQbSM6eTjJBxkQAJkAAJkAAJkAAJkAAJ1B8BrPsN63/DhrSJ1d/TL12OqbCWji1jJgESIAESIAESIAESIAESIAESKIIA57AWAY+XkgAJkAAJkAAJkAAJkAAJkAAJlI4AFdbSsWXMJEACJEACJEACJEACJEACJEACRRCgwloEPF5KAiRAAiRAAiRAAiRAAiRAAiRQOgJUWEvHljGTAAmQAAmQAAmQAAmQAAmQAAkUQYAKaxHweCkJkAAJkAAJkAAJkAAJkAAJkEDpCFBhLR3bmop5ypQp6q233qqpPDEzJFCPBG655RY1atSoesw680wCNUVg3rx5aujQoWr69Ok1lS9mhgRIgASCBKiwBolwP5TAkCFD1DHHHBN6jgdJgASqh8DAgQPVyJEjqyfBTCkJkEAogVmzZqkDDzxQffrpp6HneZAEKkHg5ptvVquvvnolbs171jABKqw1/HCZNRIgARIgARIgARIgARIoJ4E5c+aU83a8Vx0QaFgHeWQWEyDQq1cvtd566yUQUzJR/P3332qxxdLX33Laaaepxx57zMvkrrvuqm677TZvvxY2dthhB9W6dWs1bNiwWshO3eXh2WefVS1atEhNvlmXk3kUaeWYTO4YSxiBli1bqkcffVStvfbaYad5jAQqQmC11VZTaCdQSCBJAulr8SeZO8aVGIFu3bqpfffdV1144YWqbdu23l+XLl3Ufvvtp1555ZXE7pUrohEjRqiVVlpJjRs3Llewip3bbbfd1Jlnnmn+fvnll5qcW/Tjjz+qn376qWKMeePiCGCoVtOmTb06jPq88sorqy222EJddtllCuW2HMK6nAzltHNMJpeMJYxAkyZNzHd52WWXDTvNYyRQEQK77767uu+++ypyb960dglQYa3dZ1uSnP3xxx/q559/Vv369VNnn322WmedddSrr76qdtxxRwVnLqWWH374QX3//felvk3B8aNX8cQTTzR/UAooJJBG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RY0aNap+MsyckkCNEpg2bZp69NFHFde7rNEHzGyRAAl4BKiweii4kYvAkCFD1DHHHJMrCM+RAAlUAYGBAweqkSNHVkFKmUQSIIFcBD744AO1//77q7lz5+YKxnMkUHYCa6yxhrruuuvKfl/esHYJUGGt3WfLnJEACZAACZAACdQogUWLFpmcNWzYsEZzyGxVKwGttVqwYEG1Jp/pTiEBvuVS+FDSmKRevXqpddddN41JY5pIgARiEHj22WdVixYtYlzBoCRAAmkksMEGG6iHH35YNWnSJI3JY5rqmMCuu+6qYGWlkEBSBBpIL4hOKjLGQwIkQAIkQAIkQAIkQAIkQAIkQAJJEeCQ4KRIMh4SIAESIAESIAESIAESIAESIIFECVBhTRQnIyMBEiABEiABEiABEiABEiABEkiKABXW+qGVpAAAK9FJREFUpEgyHhIgARIgARIgARIgARIgARIggUQJUGFNFCcjIwESIAESIAESIAESIAESIAESSIoAFdakSDIeEiABEiABEiABEiABEiABEiCBRAlQYU0UJyMjARIgARIgARIgARIgARIgARJIigAV1qRI1ng8Tz/9tLr00ktrPJfMHgnUPoGePXuq22+/vfYzyhySQI0TGD58uDruuONqPJfMXjUSePvtt9U777xTjUlnmlNKgAprSh9M2pL17rvvqkcffTRtyWJ6SIAEYhKYNGmS+vnnn2NexeAkQAJpI/DZZ58pKK0UEkgbgf79+6vrr78+bclieqqYQMMqTnvJk75gwQLTQ6S1Lvm90n6Db7/9Vs2ePVuNGTMm7UktS/o6deqk2rZtW5Z78SbhBFAvx40bp/7666/wADwaSqB169Zq1qxZrMuhdKIPLr/88mq11VaLDsAzZSEwceJEU37LcrOU3wSdTwsXLmRdlufUqlUrtc4665Tkif3222/qo48+KknctRopmLFsFvZ0u3btqlq0aFHYxTV8VQNp9FEbi3jA99xzjzriiCMizvJwPRPo1auXeuqpp+oZQcXzPnr0aLX11ltXPB1MQH0QWGmllRQ67iiVI/DHH3+YhhybLZV7Bmm982KLLWY61Zs2bZp4Ek8++WQ1cODAxONlhCQQRuD0009X1113Xdipuj5GC2uOxw8La8uWLdWnn36aIxRP1RuBfv36KfQeUipLAPUTgvqJekohgVIRGDx4sLr55ptL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" alt="sockets"></span>
        </p></div><div class="section" title="10.17.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.sockets_requirements"></a>10.17.2.&#160;Requirements</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.reqmts"></a>
<a class="link" href="#socket.reqmts">[socket.reqmts]</a>
<a class="indexterm" name="idm168531932464"></a>
</span>

        </p><div class="section" title="10.17.2.1.&#160;Native handles"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.native_handles"></a>10.17.2.1.&#160;Native handles</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.native"></a>
<a class="link" href="#socket.reqmts.native">[socket.reqmts.native]</a>
<a class="indexterm" name="idm168531928224"></a>
</span>
          </p><p>
            Several classes described in this Technical Specification 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 POSIX,
            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="10.17.2.2.&#160;Endpoint requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.endpoint"></a>10.17.2.2.&#160;Endpoint requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.endpoint"></a>
<a class="link" href="#socket.reqmts.endpoint">[socket.reqmts.endpoint]</a>
<a class="indexterm" name="idm168531915616"></a>
</span>
          </p><p>
            An endpoint must meet the requirements of <code class="computeroutput"><span class="identifier">DefaultConstructible</span></code>
            types (C++ Std, [defaultconstructible]), <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 (possibly const) 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;18.&#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="10.17.2.3.&#160;Protocol requirements">protocol</a>
                      requirements
                    </p>
                  </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 (possibly const) value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">b</span></code> denotes a value of
            type <code class="computeroutput"><span class="identifier">X</span></code>, and <code class="computeroutput"><span class="identifier">s</span></code> denotes a (possibly const) value
            of a type that is convertible to <code class="computeroutput"><span class="identifier">size_t</span></code>
            and denotes a size in bytes.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.endpoint.t1"></a><p class="title"><b>Table&#160;19.&#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>
                      <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>address</em></span>
                      argument to functions such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a>,
                      or as the <span class="emphasis"><em>dest_addr</em></span> argument to functions
                      such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendto.html" target="_top">sendto</a>.
                      The implementation shall perform a <code class="computeroutput"><span class="keyword">static_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">b</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <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>address</em></span>
                      argument to functions such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top">getpeername</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top">getsockname</a>
                      and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top">recvfrom</a>.
                      The implementation shall perform a <code class="computeroutput"><span class="keyword">static_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="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 functions such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a>,
                      or as the <span class="emphasis"><em>dest_len</em></span> argument to functions
                      such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendto.html" target="_top">sendto</a>,
                      after appropriate integer conversion has been performed.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">b</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>
                      pre: <code class="computeroutput"><span class="identifier">s</span> <span class="special">&gt;=</span>
                      <span class="number">0</span></code><br> 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 functions such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top">getpeername</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top">getsockname</a>
                      and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top">recvfrom</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 functions such as POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top">getpeername</a>,
                      <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top">getsockname</a>
                      and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top">recvfrom</a>,
                      after appropriate integer conversion has been performed.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.17.2.3.&#160;Protocol requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.protocol"></a>10.17.2.3.&#160;Protocol requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.protocol"></a>
<a class="link" href="#socket.reqmts.protocol">[socket.reqmts.protocol]</a>
<a class="indexterm" name="idm168531807568"></a>
</span>
          </p><p>
            A protocol must meet the requirements of <code class="computeroutput"><span class="identifier">Destructible</span></code>
            (C++ Std, [destructible]), <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.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.protocol.t0"></a><p class="title"><b>Table&#160;20.&#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="10.17.2.2.&#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 (possibly const) value of type <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;21.&#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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top">socket</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top">socket</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top">socket</a>
                      (or equivalent).
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.17.2.4.&#160;Acceptable protocol requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.acceptable_protocol"></a>10.17.2.4.&#160;Acceptable protocol requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.acceptableprotocol"></a>
<a class="link" href="#socket.reqmts.acceptableprotocol">[socket.reqmts.acceptableprotocol]</a>
<a class="indexterm" name="idm168527542608"></a>
</span>
          </p><p>
            An acceptable protocol must meet the requirements for <a class="link" href="#requirements.protocol" title="10.17.2.3.&#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 acceptable protocol class.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.acceptable_protocol.t0"></a><p class="title"><b>Table&#160;22.&#160;AcceptableProtocol requirements</b></p><div class="table-contents"><table class="table" summary="AcceptableProtocol 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">socket</span></code>
                    </p>
                  </td><td>
                    <p>
                      A type that is publicly and unambiguously derived from <code class="computeroutput"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span></code>.
                    </p>
                  </td><td>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.17.2.5.&#160;Gettable socket option requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.gettable_socket_option"></a>10.17.2.5.&#160;Gettable socket option requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.gettablesocketoption"></a>
<a class="link" href="#socket.reqmts.gettablesocketoption">[socket.reqmts.gettablesocketoption]</a>
<a class="indexterm" name="idm168527521936"></a>
</span>
          </p><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 (possibly const) value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">b</span></code> denotes a value of
            type <code class="computeroutput"><span class="identifier">X</span></code>, <code class="computeroutput"><span class="identifier">p</span></code> denotes a (possibly const) value
            that meets the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
            requirements, and <code class="computeroutput"><span class="identifier">s</span></code> denotes
            a (possibly const) value of a type that is convertible to <code class="computeroutput"><span class="identifier">size_t</span></code> and denotes a size in bytes.
          </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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">b</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>
                      <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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>
                      (or equivalent), after appropriate integer conversion has been
                      performed.
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">b</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">b</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</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">b</span></code> does not
                      support the specified size.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.17.2.6.&#160;Settable socket option requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.settable_socket_option"></a>10.17.2.6.&#160;Settable socket option requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.settablesocketoption"></a>
<a class="link" href="#socket.reqmts.settablesocketoption">[socket.reqmts.settablesocketoption]</a>
<a class="indexterm" name="idm168527450944"></a>
</span>
          </p><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 (possibly const) value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            <code class="computeroutput"><span class="identifier">p</span></code> denotes a (possibly
            const) value that meets the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</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>
                      <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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</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="10.17.2.7.&#160;I/O control command requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.io_control_command"></a>10.17.2.7.&#160;I/O control command requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.iocontrolcommand"></a>
<a class="link" href="#socket.reqmts.iocontrolcommand">[socket.reqmts.iocontrolcommand]</a>
<a class="indexterm" name="idm168527397408"></a>
</span>
          </p><p>
            In the table below, <code class="computeroutput"><span class="identifier">a</span></code>
            denotes a (possibly const) value of an I/O control command class, and
            <code class="computeroutput"><span class="identifier">b</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/ioctl.html" target="_top">ioctl</a>
                      (or equivalent).
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">b</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <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 class="section" title="10.17.2.8.&#160;Connect condition requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.connect_condition"></a>10.17.2.8.&#160;Connect condition requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.reqmts.connectcondition"></a>
<a class="link" href="#socket.reqmts.connectcondition">[socket.reqmts.connectcondition]</a>
<a class="indexterm" name="idm168527369792"></a>
</span>
          </p><p>
            A connect condition type shall satisfy the requirements of <code class="computeroutput"><span class="identifier">Destructible</span></code> (C++ Std, [destructible])
            and <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
            (C++ Std, [copyconstructible]) 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 object of a connect condition type, <code class="computeroutput"><span class="identifier">ec</span></code>
            denotes a (possibly const) value of type <code class="computeroutput"><span class="identifier">error_code</span></code>,
            and <code class="computeroutput"><span class="identifier">ep</span></code> denotes a (possibly
            const) value of some type satisfying the <a class="link" href="#requirements.endpoint" title="10.17.2.2.&#160;Endpoint requirements">endpoint</a>
            requirements.
          </p><div class="table"><a name="requirements.proposed_text.sockets.sockets_requirements.connect_condition.t0"></a><p class="title"><b>Table&#160;26.&#160;ConnectCondition requirements</b></p><div class="table-contents"><table class="table" summary="ConnectCondition 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">ec</span><span class="special">,</span>
                      <span class="identifier">ep</span><span class="special">)</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">bool</span></code>
                    </p>
                  </td><td>
                    <p>
                      Returns <code class="computeroutput"><span class="keyword">true</span></code> to
                      indicate that the <code class="computeroutput"><span class="identifier">connect</span></code>
                      or <code class="computeroutput"><span class="identifier">async_connect</span></code>
                      algorithm should attempt a connection to the endpoint <code class="computeroutput"><span class="identifier">ep</span></code>. Otherwise, returns <code class="computeroutput"><span class="keyword">false</span></code> to indicate that the algorithm
                      should not attempt connection to the endpoint <code class="computeroutput"><span class="identifier">ep</span></code>, and should instead skip
                      to the next endpoint in the sequence.
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="10.17.3.&#160;Error codes"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_errc"></a>10.17.3.&#160;Error codes</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.err"></a>
<a class="link" href="#socket.err">[socket.err]</a>
<a class="indexterm" name="idm168527335920"></a>
</span>
        </p><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 <code class="computeroutput"><span class="identifier">error_category</span></code>.
          </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 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 returns 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="10.17.4.&#160;Class socket_base"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base"></a>10.17.4.&#160;Class <code class="literal">socket_base</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.base"></a>
<a class="link" href="#socket.base">[socket.base]</a>
<a class="indexterm" name="idm168527293232"></a>
</span>
        </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="keyword">public</span><span class="special">:</span>
        <span class="keyword">class</span> <a class="link" href="#classes.socket_base__bool_socket_options" title="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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="10.17.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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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_listen_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>,
          for use with 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> class's <code class="computeroutput"><span class="identifier">shutdown</span></code>
          member function.
        </p><p>
          &#8212; an enumerated type, <code class="computeroutput"><span class="identifier">wait_type</span></code>,
          for use with 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> and <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> classes' <code class="computeroutput"><span class="identifier">wait</span></code>
          and <code class="computeroutput"><span class="identifier">async_wait</span></code> member functions,
        </p><p>
          &#8212; a bitmask type, <code class="computeroutput"><span class="identifier">message_flags</span></code>,
          for use with the <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> class's <code class="computeroutput"><span class="identifier">send</span></code>,
          <code class="computeroutput"><span class="identifier">async_send</span></code>,<code class="computeroutput"><span class="identifier">receive</span></code>, and <code class="computeroutput"><span class="identifier">async_receive</span></code>
          member functions, and the <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> class's <code class="computeroutput"><span class="identifier">send</span></code>,
          <code class="computeroutput"><span class="identifier">async_send</span></code>, <code class="computeroutput"><span class="identifier">send_to</span></code>, <code class="computeroutput"><span class="identifier">async_send_to</span></code>,
          <code class="computeroutput"><span class="identifier">receive</span></code>, <code class="computeroutput"><span class="identifier">async_receive</span></code>, <code class="computeroutput"><span class="identifier">receive_from</span></code>,
          and <code class="computeroutput"><span class="identifier">async_receive_from</span></code>
          member functions.
        </p><p>
          &#8212; a constant, <code class="computeroutput"><span class="identifier">max_listen_connections</span></code>,
          for use with the <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> class's <code class="computeroutput"><span class="identifier">listen</span></code>
          member function.
        </p><div class="table"><a name="classes.proposed_text.sockets.socket_base.t0"></a><p class="title"><b>Table&#160;27.&#160;socket_base constants</b></p><div class="table-contents"><table class="table" summary="socket_base constants"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Constant Name
                  </p>
                </th><th>
                  <p>
                    POSIX macro
                  </p>
                </th><th>
                  <p>
                    Definition or notes
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">shutdown_receive</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SHUT_RD</span></code>
                  </p>
                </td><td>
                  <p>
                    Disables further receive operations.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">shutdown_send</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SHUT_WR</span></code>
                  </p>
                </td><td>
                  <p>
                    Disables further send operations.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">shutdown_both</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SHUT_RDWR</span></code>
                  </p>
                </td><td>
                  <p>
                    Disables further send and receive operations.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">wait_read</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    Wait until the socket is ready-to-read.<br> <br> For a given
                    socket, when a <code class="computeroutput"><span class="identifier">wait</span></code>
                    or <code class="computeroutput"><span class="identifier">async_wait</span></code>
                    operation using <code class="computeroutput"><span class="identifier">wait_read</span></code>
                    completes successfuly, a subsequent call to the socket's <code class="computeroutput"><span class="identifier">receive</span></code> or <code class="computeroutput"><span class="identifier">receive_from</span></code>
                    functions may complete without blocking. <br> Similarly, for
                    a given acceptor, when a <code class="computeroutput"><span class="identifier">wait</span></code>
                    or <code class="computeroutput"><span class="identifier">async_wait</span></code>
                    operation using <code class="computeroutput"><span class="identifier">wait_read</span></code>
                    completes successfully, a subsequent call to the acceptor's
                    <code class="computeroutput"><span class="identifier">accept</span></code> function
                    may complete without blocking.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">wait_write</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    Wait until the socket is ready-to-write.<br> <br> For a given
                    socket, when a <code class="computeroutput"><span class="identifier">wait</span></code>
                    or <code class="computeroutput"><span class="identifier">async_wait</span></code>
                    operation using <code class="computeroutput"><span class="identifier">wait_write</span></code>
                    completes successfuly, a subsequent call to the socket's <code class="computeroutput"><span class="identifier">send</span></code> or <code class="computeroutput"><span class="identifier">send_to</span></code>
                    functions may complete without blocking.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">wait_error</span></code>
                  </p>
                </td><td>
                </td><td>
                  <p>
                    Wait until the socket has a pending error condition.<br> <br>
                    For a given socket, when a <code class="computeroutput"><span class="identifier">wait</span></code>
                    or <code class="computeroutput"><span class="identifier">async_wait</span></code>
                    operation using <code class="computeroutput"><span class="identifier">wait_error</span></code>
                    completes successfuly, a subsequent call to one of the socket's
                    synchronous operations may complete without blocking. The nature
                    of the pending error condition determines which.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">message_peek</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">MSG_PEEK</span></code>
                  </p>
                </td><td>
                  <p>
                    Leave received data in queue.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">message_out_of_band</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">MSG_OOB</span></code>
                  </p>
                </td><td>
                  <p>
                    Out-of-band data.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">message_do_not_route</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">MSG_DONTROUTE</span></code>
                  </p>
                </td><td>
                  <p>
                    Send without using routing tables.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">max_listen_connections</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOMAXCONN</span></code>
                  </p>
                </td><td>
                  <p>
                    The implementation-defined limit on the length of the queue of
                    pending incoming connections.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.17.5.&#160;Boolean socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__bool_socket_options"></a>10.17.5.&#160;Boolean socket options</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.opt.bool"></a>
<a class="link" href="#socket.opt.bool">[socket.opt.bool]</a>
<a class="indexterm" name="idm168529861264"></a>
</span>
        </p><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">Destructible</span></code> (C++ Std, [destructible]),
          <code class="computeroutput"><span class="identifier">CopyConstructible</span></code> (C++
          Std, [copyconstructible]), <code class="computeroutput"><span class="identifier">Assignable</span></code>
          (C++ Std, [assignable]), <a class="link" href="#requirements.gettable_socket_option" title="10.17.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="10.17.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
          The boolean socket option classes are contextually convertible to bool.
        </p><p>
          Boolean socket option classes are 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">noexcept</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="keyword">noexcept</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">noexcept</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="keyword">noexcept</span><span class="special">;</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="keyword">bool</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="special">};</span>
</pre><p>
          Extensible implementations 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="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">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="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">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</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">noexcept</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="keyword">void</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="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">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="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">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="comment">// <span class="emphasis"><em>remainder unchanged</em></span></span>
<span class="keyword">private</span><span class="special">:</span>
  <span class="keyword">int</span> <span class="identifier">value_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
<span class="special">};</span>
</pre><p>
          Let <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify the POSIX macros to be passed as the <span class="emphasis"><em>level</em></span>
          and <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX
          <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
        </p><div class="table"><a name="classes.proposed_text.sockets.socket_base__bool_socket_options.t0"></a><p class="title"><b>Table&#160;28.&#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>
                    Definition or notes
                  </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"><div class="section" title="10.17.5.1.&#160;Boolean socket option constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.boolean_socket_option_constructors"></a>10.17.5.1.&#160;Boolean socket option constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.bool.cons"></a>
<a class="link" href="#socket.opt.bool.cons">[socket.opt.bool.cons]</a>
<a class="indexterm" name="idm168526519696"></a>
</span>
          </p><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></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="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> <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">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span></code>.
            </p></blockquote></div></div><div class="section" title="10.17.5.2.&#160;Boolean socket option members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.boolean_socket_option_members"></a>10.17.5.2.&#160;Boolean socket option members</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.bool.members"></a>
<a class="link" href="#socket.opt.bool.members">[socket.opt.bool.members]</a>
<a class="indexterm" name="idm168526499584"></a>
</span>
          </p><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> <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">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="keyword">noexcept</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">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="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="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">value</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="10.17.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>10.17.5.3.&#160;Boolean socket option members (extensible implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.bool.extensible"></a>
<a class="link" href="#socket.opt.bool.extensible">[socket.opt.bool.extensible]</a>
<a class="indexterm" name="idm168526459568"></a>
</span>
          </p><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="keyword">noexcept</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="keyword">noexcept</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">void</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">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">std</span><span class="special">::</span><span class="identifier">addressof</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">const</span> <span class="keyword">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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="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="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">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="10.17.6.&#160;Integral socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__int_socket_options"></a>10.17.6.&#160;Integral socket options</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.opt.int"></a>
<a class="link" href="#socket.opt.int">[socket.opt.int]</a>
<a class="indexterm" name="idm168526372032"></a>
</span>
        </p><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">Destructible</span></code> (C++ Std, [destructible]),
          <code class="computeroutput"><span class="identifier">CopyConstructible</span></code> (C++
          Std, [copyconstructible]), <code class="computeroutput"><span class="identifier">Assignable</span></code>
          (C++ Std, [assignable]), <a class="link" href="#requirements.gettable_socket_option" title="10.17.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="10.17.2.6.&#160;Settable socket option requirements"><code class="computeroutput"><span class="identifier">SettableSocketOption</span></code></a>.
        </p><p>
          Integral socket option classes are 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">noexcept</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="keyword">noexcept</span><span class="special">;</span>
<span class="special">};</span>
</pre><p>
          Extensible implementations 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="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">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="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">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</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">noexcept</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="keyword">void</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="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">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="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">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="comment">// <span class="emphasis"><em>remainder unchanged</em></span></span>
<span class="keyword">private</span><span class="special">:</span>
  <span class="keyword">int</span> <span class="identifier">value_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
<span class="special">};</span>
</pre><p>
          Let <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify the POSIX macros to be passed as the <span class="emphasis"><em>level</em></span>
          and <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX
          <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
        </p><div class="table"><a name="classes.proposed_text.sockets.socket_base__int_socket_options.t0"></a><p class="title"><b>Table&#160;29.&#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>
                    Definition or notes
                  </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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="10.17.6.1.&#160;Integral socket option constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.integral_socket_option_constructors"></a>10.17.6.1.&#160;Integral socket option constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.int.cons"></a>
<a class="link" href="#socket.opt.int.cons">[socket.opt.int.cons]</a>
<a class="indexterm" name="idm168527729184"></a>
</span>
          </p><pre class="programlisting"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></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">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="10.17.6.2.&#160;Integral socket option members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.integral_socket_option_members"></a>10.17.6.2.&#160;Integral socket option members</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.int.members"></a>
<a class="link" href="#socket.opt.int.members">[socket.opt.int.members]</a>
<a class="indexterm" name="idm168533012448"></a>
</span>
          </p><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="keyword">noexcept</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="10.17.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>10.17.6.3.&#160;Integral socket option members (extensible implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.base.int.extensible"></a>
<a class="link" href="#socket.base.int.extensible">[socket.base.int.extensible]</a>
<a class="indexterm" name="idm168532989888"></a>
</span>
          </p><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="keyword">noexcept</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="keyword">noexcept</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">void</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">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">std</span><span class="special">::</span><span class="identifier">addressof</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">const</span> <span class="keyword">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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="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="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">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="10.17.7.&#160;Class socket_base::linger"><div class="titlepage"><div><div><h4 class="title"><a name="classes.socket_base__linger"></a>10.17.7.&#160;Class <code class="literal">socket_base::linger</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.opt.linger"></a>
<a class="link" href="#socket.opt.linger">[socket.opt.linger]</a>
<a class="indexterm" name="idm168532901968"></a>
</span>
        </p><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">Destructible</span></code> (C++ Std,
          [destructible]), <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
          (C++ Std, [copyconstructible]), <code class="computeroutput"><span class="identifier">Assignable</span></code>
          (C++ Std, [assignable]), <a class="link" href="#requirements.gettable_socket_option" title="10.17.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="10.17.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="keyword">noexcept</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="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">noexcept</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="keyword">noexcept</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">noexcept</span><span class="special">;</span>

        <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">timeout</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="keyword">void</span> <span class="identifier">timeout</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">t</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>
          Extensible implementations 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="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">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="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">Protocol</span><span class="special">&gt;</span> <span class="keyword">void</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">noexcept</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="keyword">void</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="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">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="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">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="comment">// <span class="emphasis"><em>remainder unchanged</em></span></span>
      <span class="keyword">private</span><span class="special">:</span>
        <span class="special">::</span><span class="identifier">linger</span> <span class="identifier">value_</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="10.17.7.1.&#160;socket_base::linger constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__socket_base__linger__constructors"></a>10.17.7.1.&#160;<code class="literal">socket_base::linger</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.linger.cons"></a>
<a class="link" href="#socket.opt.linger.cons">[socket.opt.linger.cons]</a>
<a class="indexterm" name="idm168525417872"></a>
</span>
          </p><pre class="programlisting"><span class="identifier">linger</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="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="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">0</span><span class="special">)</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="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">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="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="10.17.7.2.&#160;socket_base::linger members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__socket_base__linger__members"></a>10.17.7.2.&#160;<code class="literal">socket_base::linger</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.linger.members"></a>
<a class="link" href="#socket.opt.linger.members">[socket.opt.linger.members]</a>
<a class="indexterm" name="idm168525386800"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">enabled</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">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> <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">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">e</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">timeout</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">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="identifier">value_</span><span class="special">.</span><span class="identifier">l_linger</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">timeout</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">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="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="10.17.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>10.17.7.3.&#160;<code class="literal">socket_base::linger</code> members (extensible implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.opt.linger.extensible"></a>
<a class="link" href="#socket.opt.linger.extensible">[socket.opt.linger.extensible]</a>
<a class="indexterm" name="idm168525342592"></a>
</span>
          </p><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="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">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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="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">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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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">const</span> <span class="keyword">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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="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="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">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="10.17.8.&#160;Class template basic_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket"></a>10.17.8.&#160;Class template <code class="literal">basic_socket</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.basic"></a>
<a class="link" href="#socket.basic">[socket.basic]</a>
<a class="indexterm" name="idm168525240848"></a>
</span>
        </p><p>
          Class template <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> is used as the base class for the
          <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>
          and <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> class templates. It provides functionality
          that is common to both types of socket.
        </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">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="10.17.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_type</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="10.17.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="10.17.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="10.17.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="keyword">noexcept</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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.17.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="keyword">private</span><span class="special">:</span>
        <span class="identifier">protocol_type</span> <span class="identifier">protocol_</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="10.17.8.1.&#160;basic_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__constructors"></a>10.17.8.1.&#160;<code class="literal">basic_socket</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.basic.cons"></a>
<a class="link" href="#socket.basic.cons">[socket.basic.cons]</a>
<a class="indexterm" name="idm168524910464"></a>
</span>
          </p><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>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> Opens this 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>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">protocol_</span> <span class="special">==</span>
              <span class="identifier">protocol</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> Opens and binds this 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>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">protocol_</span> <span class="special">==</span>
              <span class="identifier">endpoint</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_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>Requires:</em></span> <code class="computeroutput"><span class="identifier">native_socket</span></code>
              is a native handle to an open socket.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the existing native socket into
              this socket 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">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">protocol_</span> <span class="special">==</span>
              <span class="identifier">protocol</span></code>.
            </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></code> is equal to the prior value of <code class="computeroutput"><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">native_handle</span><span class="special">()</span></code>
              returns the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">()</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span></code>
              is the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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></code> is equal to the prior value of <code class="computeroutput"><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">native_handle</span><span class="special">()</span></code>
              returns the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">()</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span></code>
              is the result of converting the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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="10.17.8.2.&#160;basic_socket destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__destructor"></a>10.17.8.2.&#160;<code class="literal">basic_socket</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.basic.dtor"></a>
<a class="link" href="#socket.basic.dtor">[socket.basic.dtor]</a>
<a class="indexterm" name="idm168524721328"></a>
</span>
          </p><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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              socket, disables the linger socket option to prevent the destructor
              from blocking, and releases socket resources as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div></div><div class="section" title="10.17.8.3.&#160;basic_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__assignment"></a>10.17.8.3.&#160;<code class="literal">basic_socket</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.basic.assign"></a>
<a class="link" href="#socket.basic.assign">[socket.basic.assign]</a>
<a class="indexterm" name="idm168524701440"></a>
</span>
          </p><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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              socket. Completion handlers for canceled 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> yields <code class="computeroutput"><span class="keyword">true</span></code>. Disables the linger socket option
              to prevent the assignment from blocking, and releases socket resources
              as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. 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></code> is equal to the prior value of <code class="computeroutput"><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">protocol_</span></code> is the prior value of
              <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              socket. Completion handlers for canceled 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> yields <code class="computeroutput"><span class="keyword">true</span></code>. Disables the linger socket option
              to prevent the assignment from blocking, and releases socket resources
              as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. 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></code> is equal to the prior value of <code class="computeroutput"><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">protocol_</span></code> is the result of converting
              the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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="10.17.8.4.&#160;basic_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket__operations"></a>10.17.8.4.&#160;<code class="literal">basic_socket</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.basic.ops"></a>
<a class="link" href="#socket.basic.ops">[socket.basic.ops]</a>
<a class="indexterm" name="idm168527708352"></a>
</span>
          </p><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 this socket.
            </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>Effects:</em></span> Establishes the postcondition, as if
              by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top">socket</a><span class="special">(</span><span class="identifier">protocol</span><span class="special">.</span><span class="identifier">family</span><span class="special">(),</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">type</span><span class="special">(),</span> <span class="identifier">protocol</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">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">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</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 <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.
            </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="identifier">native_socket</span></code>
              is a native handle to an open socket.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the native socket handle to this
              socket 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">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">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</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 <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>.
            </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 demultiplexer,
            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 Windows 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="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="keyword">bool</span></code>
              indicating whether this 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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              socket, and establishes the postcondition as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</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">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> Cancels all outstanding asynchronous
              operations associated with this socket. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</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">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><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">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 this socket, as if
              by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">protocol_</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">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 this socket, as if
              by POSIX:
</p><pre class="programlisting"><span class="identifier">socklen_t</span> <span class="identifier">option_len</span> <span class="special">=</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">);</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span>
                        <span class="identifier">option</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span>
                        <span class="special">&amp;</span><span class="identifier">option_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">option</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">option_len</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">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 this
              socket, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/ioctl.html" target="_top">ioctl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">command</span><span class="special">.</span><span class="identifier">name</span><span class="special">(),</span> <span class="identifier">command</span><span class="special">.</span><span class="identifier">data</span><span class="special">())</span></code>.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This Technical Specification does not include any classes that satisfy
            <a class="link" href="#requirements.io_control_command" title="10.17.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>Effects:</em></span> Sets the non-blocking mode of this socket.
              If <code class="computeroutput"><span class="identifier">mode</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>, 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 <code class="computeroutput"><span class="keyword">false</span></code>, subsequent synchronous operations
              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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </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 this 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 POSIX:
</p><pre class="programlisting"><span class="keyword">int</span> <span class="identifier">flags</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fcntl.html" target="_top">fcntl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">F_GETFL</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">flags</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">mode</span><span class="special">)</span>
    <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">O_NONBLOCK</span><span class="special">;</span>
  <span class="keyword">else</span>
    <span class="identifier">flags</span> <span class="special">&amp;=</span> <span class="special">~</span><span class="identifier">O_NONBLOCK</span><span class="special">;</span>
  <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fcntl.html" target="_top">fcntl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">F_SETFL</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="special">}</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              The native non-blocking mode has 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">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><span class="keyword">false</span></code>.<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 this socket is at the out-of-band
              data mark, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sockatmark.html" target="_top">sockatmark</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. [<span class="emphasis"><em>Note:</em></span> The
              <code class="computeroutput"><span class="identifier">at_mark</span><span class="special">()</span></code>
              function must be used in conjunction with the <code class="computeroutput"><span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">out_of_band_inline</span></code>
              socket option. &#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> A <code class="computeroutput"><span class="keyword">bool</span></code>
              indicating whether this 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>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 <code class="computeroutput"><span class="keyword">false</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 this socket to the specified local
              endpoint, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/bind.html" target="_top">bind</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span></code>.
            </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 POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/shutdown.html" target="_top">shutdown</a><span class="special">(</span><span class="identifier">native_handle</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">what</span><span class="special">))</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 POSIX:
</p><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">endpoint</span><span class="special">;</span>
<span class="identifier">socklen_t</span> <span class="identifier">endpoint_len</span> <span class="special">=</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">==</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top">getsockname</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">endpoint_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">endpoint_len</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, <code class="computeroutput"><span class="identifier">endpoint</span></code>.
              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 this socket, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">endpoint</span><span class="special">;</span>
<span class="identifier">socklen_t</span> <span class="identifier">endpoint_len</span> <span class="special">=</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">==</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top">getpeername</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">endpoint_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">endpoint_len</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, <code class="computeroutput"><span class="identifier">endpoint</span></code>.
              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 <code class="computeroutput"><span class="keyword">false</span></code>,
              opens this 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>. If <code class="computeroutput"><span class="identifier">ec</span></code>,
              returns with no further action. Connects this socket to the specified
              remote endpoint, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">size</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="emphasis"><em>DEDUCED</em></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>
              <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 <code class="computeroutput"><span class="keyword">false</span></code>,
              opens this 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>. If <code class="computeroutput"><span class="identifier">ec</span></code>,
              the operation completes immediately with no further action. Initiates
              an asynchronous operation to connect this socket to the specified remote
              endpoint, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When an asynchronous connect operation on this socket is simultaneously
              outstanding with another asynchronous connect, read, or write operation
              on this socket, the behavior is undefined.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              If a program performs a synchronous operation on this 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 outstanding
              asynchronous connect operation, the behavior is undefined.
            </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 this socket to be ready to
              read, ready to write, or to have error conditions pending, as if by
              POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/poll.html" target="_top">poll</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">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 <code class="computeroutput"><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">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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 this socket to be ready to read, ready to write, or to have
              error conditions pending, as if by POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/poll.html" target="_top">poll</a>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              When there are multiple simultaneously outstanding asynchronous wait
              operations on this socket with the same <code class="computeroutput"><span class="identifier">wait_type</span></code>
              value, all of these operations complete when this socket enters the
              corresponding ready state. The order of invocation of the completion
              handlers for these operations 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">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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.17.9.&#160;Class template basic_datagram_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_datagram_socket"></a>10.17.9.&#160;Class template <code class="literal">basic_datagram_socket</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.dgram"></a>
<a class="link" href="#socket.dgram">[socket.dgram]</a>
<a class="indexterm" name="idm168523946752"></a>
</span>
        </p><p>
          The class template <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> is used to send and receive discrete
          messages of fixed maximum length.
        </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">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="10.17.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_type</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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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><p>
          For a given socket, a program may initiate asynchronous read or write operations
          such that there are multiple simultaneously outstanding asynchronous operations.
        </p><p>
          When there are multiple outstanding asynchronous read operations with zero
          <code class="computeroutput"><span class="identifier">flags</span></code>, the <code class="computeroutput"><span class="identifier">buffers</span></code> are filled in the order in which
          the operations were issued. The order of invocation of the handlers for
          these operations is unspecified. When there are multiple asynchronous read
          operations, where at least one has non-zero <code class="computeroutput"><span class="identifier">flags</span></code>,
          the behavior is unspecified.
        </p><p>
          When there are multiple outstanding asynchronous write operations with
          zero <code class="computeroutput"><span class="identifier">flags</span></code>, the <code class="computeroutput"><span class="identifier">buffers</span></code> are transmitted in the order
          in which the operations were issued. The order of invocation of the handlers
          for these operations is unspecified. When there are multiple outstanding
          asynchronous write operations, where at least one has non-zero <code class="computeroutput"><span class="identifier">flags</span></code>, the behavior is unspecified.
        </p><p>
          If a program performs a synchronous operation on this 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">shutdown</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 an outstanding asynchronous read operation, the behavior
          is undefined.
        </p><p>
          If a program performs a synchronous operation on this 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">shutdown</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 an outstanding asynchronous write operation, the behavior
          is undefined.
        </p><div class="section" title="10.17.9.1.&#160;basic_datagram_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__constructors"></a>10.17.9.1.&#160;<code class="literal">basic_datagram_socket</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.dgram.cons"></a>
<a class="link" href="#socket.dgram.cons">[socket.dgram.cons]</a>
<a class="indexterm" name="idm168527092912"></a>
</span>
          </p><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> Initializes 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> Initializes 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> Initializes 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> Initializes 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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="10.17.9.2.&#160;basic_datagram_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__assignment"></a>10.17.9.2.&#160;<code class="literal">basic_datagram_socket</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.dgram.assign"></a>
<a class="link" href="#socket.dgram.assign">[socket.dgram.assign]</a>
<a class="indexterm" name="idm168524520112"></a>
</span>
          </p><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> Equivalent to <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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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> Equivalent to <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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="10.17.9.3.&#160;basic_datagram_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_datagram_socket__operations"></a>10.17.9.3.&#160;<code class="literal">basic_datagram_socket</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.dgram.op"></a>
<a class="link" href="#socket.dgram.op">[socket.dgram.op]</a>
<a class="indexterm" name="idm168526234176"></a>
</span>
          </p><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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="10.16.2.4.&#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> Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and reads data from this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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>Note:</em></span> This operation may be used with connection-mode
              or connectionless-mode sockets, but 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><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="emphasis"><em>DEDUCED</em></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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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>
              <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 this socket. Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then reads data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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>Note:</em></span> This operation may be used with connection-mode
              or connectionless-mode sockets, but 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>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">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span></code> is set in flags.
            </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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="10.16.2.4.&#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> Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and reads data from this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">ssize_t</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">sender</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span><span class="special">);</span>
</pre><p>
            </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>Note:</em></span> This operation may be used with connection-mode
              or connectionless-mode sockets, but 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><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="emphasis"><em>DEDUCED</em></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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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>
              <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 this socket. Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then reads data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">ssize_t</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">sender</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span><span class="special">);</span>
</pre><p>
            </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>Note:</em></span> This operation may be used with connection-mode
              or connectionless-mode sockets, but 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>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">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span></code> is set in flags.
            </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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="10.16.2.6.&#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> Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and writes data to this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="emphasis"><em>DEDUCED</em></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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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>
              <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 this socket. Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then writes data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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">recipient</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="10.16.2.6.&#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> Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and writes data to this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="emphasis"><em>DEDUCED</em></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">recipient</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">recipient</span><span class="special">,</span> <span class="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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">recipient</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>
              <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 this socket. Constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then writes data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="identifier">sender</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="10.17.10.&#160;Class template basic_stream_socket"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_stream_socket"></a>10.17.10.&#160;Class template <code class="literal">basic_stream_socket</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.stream"></a>
<a class="link" href="#socket.stream">[socket.stream]</a>
<a class="indexterm" name="idm168522849008"></a>
</span>
        </p><p>
          The class template <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> is used to exchange data with a peer
          over a sequenced, reliable, bidirectional, connection-mode byte stream.
        </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">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="10.17.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_type</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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="emphasis"><em>DEDUCED</em></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="10.16.2.8.&#160;Buffer-oriented synchronous read stream requirements">synchronous
          read streams</a>, <a class="link" href="#requirements.sync_write_stream" title="10.16.2.10.&#160;Buffer-oriented synchronous write stream requirements">synchronous
          write streams</a>, <a class="link" href="#requirements.async_read_stream" title="10.16.2.9.&#160;Buffer-oriented asynchronous read stream requirements">asynchronous
          read streams</a>, and <a class="link" href="#requirements.async_write_stream" title="10.16.2.11.&#160;Buffer-oriented asynchronous write stream requirements">asynchronous
          write streams</a>.
        </p><p>
          For a given socket, a program may initiate asynchronous read or write operations
          such that there are multiple simultaneously outstanding asynchronous operations.
        </p><p>
          When there are multiple outstanding asynchronous read operations with zero
          <code class="computeroutput"><span class="identifier">flags</span></code>, the <code class="computeroutput"><span class="identifier">buffers</span></code> are filled in the order in which
          the operations were issued. The order of invocation of the handlers for
          these operations is unspecified. When there are multiple asynchronous read
          operations, where at least one has non-zero <code class="computeroutput"><span class="identifier">flags</span></code>,
          the behavior is unspecified.
        </p><p>
          When there are multiple outstanding asynchronous write operations with
          zero <code class="computeroutput"><span class="identifier">flags</span></code>, the <code class="computeroutput"><span class="identifier">buffers</span></code> are transmitted in the order
          in which the operations were issued. The order of invocation of the handlers
          for these operations is unspecified. When there are multiple outstanding
          asynchronous write operations, where at least one has non-zero <code class="computeroutput"><span class="identifier">flags</span></code>, the behavior is unspecified.
        </p><p>
          If a program performs a synchronous operation on this 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">shutdown</span></code>, or <code class="computeroutput"><span class="identifier">send</span></code>, while there is an outstanding asynchronous
          read operation, the behavior is undefined.
        </p><p>
          If a program performs a synchronous operation on this 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">shutdown</span></code>, or <code class="computeroutput"><span class="identifier">receive</span></code>, while there is an outstanding
          asynchronous write operation, the behavior is undefined.
        </p><div class="section" title="10.17.10.1.&#160;basic_stream_socket constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__constructors"></a>10.17.10.1.&#160;<code class="literal">basic_stream_socket</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.stream.cons"></a>
<a class="link" href="#socket.stream.cons">[socket.stream.cons]</a>
<a class="indexterm" name="idm168526870624"></a>
</span>
          </p><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> Initializes 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> Initializes 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> Initializes 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> Initializes 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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="10.17.10.2.&#160;basic_stream_socket assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__assignment"></a>10.17.10.2.&#160;<code class="literal">basic_stream_socket</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.stream.assign"></a>
<a class="link" href="#socket.stream.assign">[socket.stream.assign]</a>
<a class="indexterm" name="idm168526775792"></a>
</span>
          </p><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> Equivalent to <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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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> Equivalent to <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="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</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="10.17.10.3.&#160;basic_stream_socket operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_stream_socket__operations"></a>10.17.10.3.&#160;<code class="literal">basic_stream_socket</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.stream.ops"></a>
<a class="link" href="#socket.stream.ops">[socket.stream.ops]</a>
<a class="indexterm" name="idm168526728592"></a>
</span>
          </p><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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="10.16.2.4.&#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> 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>, returns immediately with no error.
              Otherwise, constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and reads data from this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="emphasis"><em>DEDUCED</em></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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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>
              <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 this socket. 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>, the asynchronous operation completes
              immediately with no error and <code class="computeroutput"><span class="identifier">n</span>
              <span class="special">==</span> <span class="number">0</span></code>.
              Otherwise, constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then reads data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_peek</span></code> is set in flags. &#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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="10.16.2.6.&#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> 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>, returns immediately with no error.
              Otherwise, constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              and writes data to this socket as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="emphasis"><em>DEDUCED</em></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="identifier">socket_base</span><span class="special">::</span><span class="identifier">message_flags</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="emphasis"><em>DEDUCED</em></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>
              <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 this socket. 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>, the asynchronous operation completes
              immediately with no error and <code class="computeroutput"><span class="identifier">n</span>
              <span class="special">==</span> <span class="number">0</span></code>.
              Otherwise, constructs an array <code class="computeroutput"><span class="identifier">iov</span></code>
              of POSIX type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">iovec</span></code> and length <code class="computeroutput"><span class="identifier">iovlen</span></code>,
              corresponding to <code class="computeroutput"><span class="identifier">buffers</span></code>,
              then writes data as if by POSIX:
</p><pre class="programlisting"><span class="identifier">msghdr</span> <span class="identifier">message</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_name</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_namelen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iov</span> <span class="special">=</span> <span class="identifier">iov</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_iovlen</span> <span class="special">=</span> <span class="identifier">iovlen</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_control</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_controllen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">message</span><span class="special">.</span><span class="identifier">msg_flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">message</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">flags</span><span class="special">));</span>
</pre><p>
            </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="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="emphasis"><em>DEDUCED</em></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="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="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="emphasis"><em>DEDUCED</em></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="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="10.17.11.&#160;Class template basic_socket_acceptor"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_acceptor"></a>10.17.11.&#160;Class template <code class="literal">basic_socket_acceptor</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.acceptor"></a>
<a class="link" href="#socket.acceptor">[socket.acceptor]</a>
<a class="indexterm" name="idm168522043008"></a>
</span>
        </p><p>
          An object of class template <code class="computeroutput"><span class="identifier">basic_socket_acceptor</span><span class="special">&lt;</span><span class="identifier">AcceptableProtocol</span><span class="special">&gt;</span></code> is used to listen for, and queue, incoming
          socket connections. Socket objects that represent the incoming connections
          are dequeued by calling <code class="computeroutput"><span class="identifier">accept</span></code>
          or <code class="computeroutput"><span class="identifier">async_accept</span></code>.
        </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">AcceptableProtocol</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="10.17.2.1.&#160;Native handles">native handles</a></span>
        <span class="keyword">typedef</span> <span class="identifier">AcceptableProtocol</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_type</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">protocol_type</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket_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="10.17.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="10.17.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="10.17.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_listen_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="identifier">socket_type</span> <span class="identifier">accept</span><span class="special">();</span>
        <span class="identifier">socket_type</span> <span class="identifier">accept</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">socket_type</span> <span class="identifier">accept</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">socket_type</span> <span class="identifier">accept</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">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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">CompletionToken</span><span class="special">&gt;</span>
          <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

        <span class="identifier">socket_type</span> <span class="identifier">accept</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">socket_type</span> <span class="identifier">accept</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="identifier">socket_type</span> <span class="identifier">accept</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">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
        <span class="identifier">socket_type</span> <span class="identifier">accept</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">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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
          <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">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="emphasis"><em>DEDUCED</em></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">private</span><span class="special">:</span>
        <span class="identifier">protocol_type</span> <span class="identifier">protocol_</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>
          For a given acceptor, a program may initiate asynchronous accept or wait
          operations such that there are multiple simultaneously outstanding asynchronous
          operations.
        </p><p>
          When there are multiple outstanding asynchronous accept operations the
          order in which the incoming connections are dequeued, and the order of
          invocation of the completion handlers for these operations, is unspecified.
        </p><div class="section" title="10.17.11.1.&#160;basic_socket_acceptor constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__constructors"></a>10.17.11.1.&#160;<code class="literal">basic_socket_acceptor</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.acceptor.cons"></a>
<a class="link" href="#socket.acceptor.cons">[socket.acceptor.cons]</a>
<a class="indexterm" name="idm168521778848"></a>
</span>
          </p><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>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> Opens this 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>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</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> Opens and binds this 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>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span>
              <span class="special">==</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">()</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>Requires:</em></span> <code class="computeroutput"><span class="identifier">native_acceptor</span></code>
              is a native handle to an open acceptor.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the existing native acceptor
              into this acceptor 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">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>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</span></code>.
            </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">AcceptableProtocol</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">protocol_</span></code>
              is equal to the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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">AcceptableProtocol</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">native_handle</span><span class="special">()</span></code> returns the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">()</span></code>.<br>
              &#8212; <code class="computeroutput"><span class="identifier">protocol_</span></code> is the result
              of converting the prior value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</span></code>.<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="10.17.11.2.&#160;basic_socket_acceptor destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__destructor"></a>10.17.11.2.&#160;<code class="literal">basic_socket_acceptor</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.acceptor.dtor"></a>
<a class="link" href="#socket.acceptor.dtor">[socket.acceptor.dtor]</a>
<a class="indexterm" name="idm168521562448"></a>
</span>
          </p><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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              acceptor, and releases acceptor resources as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div></div><div class="section" title="10.17.11.3.&#160;basic_socket_acceptor assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__assignment"></a>10.17.11.3.&#160;<code class="literal">basic_socket_acceptor</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.acceptor.assign"></a>
<a class="link" href="#socket.acceptor.assign">[socket.acceptor.assign]</a>
<a class="indexterm" name="idm168521542736"></a>
</span>
          </p><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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              acceptor, and releases acceptor resources as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</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>. Completion
              handlers for canceled 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>
              yields <code class="computeroutput"><span class="keyword">true</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 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">native_handle</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">native_handle</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span></code> is the same value as <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              acceptor, and releases acceptor resources as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</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>. Completion
              handlers for canceled 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>
              yields <code class="computeroutput"><span class="keyword">true</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 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">native_handle</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">native_handle</span><span class="special">()</span></code> prior to the assignment.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span></code> is the result of converting
              the value of <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">protocol_</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="10.17.11.4.&#160;basic_socket_acceptor operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_acceptor__operations"></a>10.17.11.4.&#160;<code class="literal">basic_socket_acceptor</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.acceptor.ops"></a>
<a class="link" href="#socket.acceptor.ops">[socket.acceptor.ops]</a>
<a class="indexterm" name="idm168521417136"></a>
</span>
          </p><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 this acceptor.
            </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>Effects:</em></span> Establishes the postcondition, as if
              by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top">socket</a><span class="special">(</span><span class="identifier">protocol</span><span class="special">.</span><span class="identifier">family</span><span class="special">(),</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">type</span><span class="special">(),</span> <span class="identifier">protocol</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">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>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</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 <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><span class="keyword">true</span></code>.
            </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="identifier">native_acceptor</span></code>
              is a native handle to an open acceptor.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Assigns the native acceptor handle to
              this 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">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>.<br> &#8212; <code class="computeroutput"><span class="identifier">protocol_</span>
              <span class="special">==</span> <span class="identifier">protocol</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 <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><span class="keyword">true</span></code>.
            </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 demultiplexer,
            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 Windows 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 this 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 <code class="computeroutput"><span class="keyword">true</span></code>,
              cancels all outstanding asynchronous operations associated with this
              acceptor, and establishes the postcondition as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/close.html" target="_top">close</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">())</span></code>. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</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">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> Cancels all outstanding asynchronous
              operations associated with this acceptor. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</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">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><span class="keyword">false</span></code>.<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 cancelation. The conditions under which cancelation 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 Windows 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 this acceptor, as if
              by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">protocol_</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">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 this acceptor, as
              if by POSIX:
</p><pre class="programlisting"><span class="identifier">socklen_t</span> <span class="identifier">option_len</span> <span class="special">=</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">);</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">level</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span>
                        <span class="identifier">option</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span> <span class="identifier">option</span><span class="special">.</span><span class="identifier">data</span><span class="special">(</span><span class="identifier">protocol_</span><span class="special">),</span>
                        <span class="special">&amp;</span><span class="identifier">option_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">option</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">option_len</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">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 this
              acceptor, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/ioctl.html" target="_top">ioctl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">command</span><span class="special">.</span><span class="identifier">name</span><span class="special">(),</span> <span class="identifier">command</span><span class="special">.</span><span class="identifier">data</span><span class="special">())</span></code>.
            </p></blockquote></div><div class="sidebar"><p class="title"><b></b></p><p>
            This Technical Specification does not include any classes that satisfy
            <a class="link" href="#requirements.io_control_command" title="10.17.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>Effects:</em></span> Sets the non-blocking mode of this acceptor.
              If <code class="computeroutput"><span class="identifier">mode</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>, 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 <code class="computeroutput"><span class="keyword">false</span></code>, 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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </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 this 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 POSIX:
</p><pre class="programlisting"><span class="keyword">int</span> <span class="identifier">flags</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fcntl.html" target="_top">fcntl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">F_GETFL</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">flags</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">mode</span><span class="special">)</span>
    <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">O_NONBLOCK</span><span class="special">;</span>
  <span class="keyword">else</span>
    <span class="identifier">flags</span> <span class="special">&amp;=</span> <span class="special">~</span><span class="identifier">O_NONBLOCK</span><span class="special">;</span>
  <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fcntl.html" target="_top">fcntl</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">F_SETFL</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">);</span>
<span class="special">}</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              The native non-blocking mode has 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">bad_file_descriptor</span></code>
              &#8212; if <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span></code>
              is <code class="computeroutput"><span class="keyword">false</span></code>.<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 this acceptor to the specified
              local endpoint, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/bind.html" target="_top">bind</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span></code>.
            </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">socket_base</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 this acceptor as ready to accept
              connections, as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/listen.html" target="_top">listen</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">backlog</span><span class="special">)</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 this acceptor, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">endpoint_type</span> <span class="identifier">endpoint</span><span class="special">;</span>
<span class="identifier">socklen_t</span> <span class="identifier">endpoint_len</span> <span class="special">=</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">==</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top">getsockname</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="special">&amp;</span><span class="identifier">endpoint_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">endpoint_len</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, <code class="computeroutput"><span class="identifier">endpoint</span></code>.
              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>Effects:</em></span> If <code class="computeroutput"><span class="identifier">mode</span></code>
              is true, subsequent synchronous or asynchronous accept operations on
              this acceptor 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 <code class="computeroutput"><span class="keyword">false</span></code>,
              subsequent accept operations will 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 <code class="computeroutput"><span class="keyword">false</span></code>, the implementation
              will restart the call to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </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 on this acceptor
              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="identifier">socket_type</span> <span class="identifier">accept</span><span class="special">();</span>
<span class="identifier">socket_type</span> <span class="identifier">accept</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">accept</span><span class="special">(</span><span class="identifier">get_executor</span><span class="special">().</span><span class="identifier">context</span><span class="special">(),</span> <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">socket_type</span> <span class="identifier">accept</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">socket_type</span> <span class="identifier">accept</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">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> Extracts a socket from the queue of pending
              connections of the acceptor, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">native_handle_type</span> <span class="identifier">h</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="keyword">nullptr</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">h</span></code>
              is an open native socket, <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span></code>; otherwise <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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_accept</span><span class="special">(</span><span class="identifier">get_executor</span><span class="special">().</span><span class="identifier">context</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">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">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>
              <span class="identifier">socket_type</span> <span class="identifier">s</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
              extract a socket from the queue of pending connections of the acceptor,
              as if by POSIX:
</p><pre class="programlisting"><span class="identifier">native_handle_type</span> <span class="identifier">h</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="keyword">nullptr</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span>
</pre><p>
              On success, <code class="computeroutput"><span class="identifier">s</span></code> is <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">h</span><span class="special">).</span> <span class="identifier">Otherwise</span><span class="special">,</span>
              </code>s<code class="computeroutput"> <span class="identifier">is</span> </code>socket_type(ios)`.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">socket_type</span> <span class="identifier">accept</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">socket_type</span> <span class="identifier">accept</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>Returns:</em></span> <code class="computeroutput"><span class="identifier">accept</span><span class="special">(</span><span class="identifier">get_executor</span><span class="special">().</span><span class="identifier">context</span><span class="special">(),</span> <span class="identifier">endpoint</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">socket_type</span> <span class="identifier">accept</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">endpoint_type</span><span class="special">&amp;</span> <span class="identifier">endpoint</span><span class="special">);</span>
<span class="identifier">socket_type</span> <span class="identifier">accept</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">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> Extracts a socket from the queue of pending
              connections of the acceptor, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">socklen_t</span> <span class="identifier">endpoint_len</span> <span class="special">=</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="identifier">native_handle_type</span> <span class="identifier">h</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span>
                              <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
                              <span class="special">&amp;</span><span class="identifier">endpoint_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">h</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">endpoint_len</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If <code class="computeroutput"><span class="identifier">h</span></code>
              is an open native socket, <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span></code>; otherwise <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">async_accept</span><span class="special">(</span><span class="identifier">get_executor</span><span class="special">().</span><span class="identifier">context</span><span class="special">(),</span> <span class="identifier">endpoint</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">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_accept</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">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>
              <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">socket_type</span> <span class="identifier">s</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
              extract a socket from the queue of pending connections of the acceptor,
              as if by POSIX:
</p><pre class="programlisting"><span class="identifier">socklen_t</span> <span class="identifier">endpoint_len</span> <span class="special">=</span> <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
<span class="identifier">native_handle_type</span> <span class="identifier">h</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top">accept</a><span class="special">(</span><span class="identifier">native_handle</span><span class="special">(),</span>
                              <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span>
                              <span class="special">&amp;</span><span class="identifier">endpoint_len</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">h</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span>
  <span class="identifier">endpoint</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">endpoint_len</span><span class="special">);</span>
</pre><p>
              On success, <code class="computeroutput"><span class="identifier">s</span></code> is <code class="computeroutput"><span class="identifier">socket_type</span><span class="special">(</span><span class="identifier">ios</span><span class="special">,</span> <span class="identifier">h</span><span class="special">).</span> <span class="identifier">Otherwise</span><span class="special">,</span>
              </code>s<code class="computeroutput"> <span class="identifier">is</span> </code>socket_type(ios)`.
            </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 have a queued
              incoming connection, or to have error conditions pending, as if by
              POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/poll.html" target="_top">poll</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="emphasis"><em>DEDUCED</em></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 have a queued incoming connection, or to have
              error conditions pending, as if by POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/poll.html" target="_top">poll</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 completions handlers for
              these operations 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">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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </p></blockquote></div></div></div></div><div class="section" title="10.18.&#160;Socket iostreams"><div class="titlepage"><div><div><h3 class="title"><a name="network.socket_streams"></a>10.18.&#160;Socket iostreams</h3></div></div></div><p>
        <span class="xrefid">
<a name="socket.iostreams"></a>
<a class="link" href="#socket.iostreams">[socket.iostreams]</a>
<a class="indexterm" name="idm168525580736"></a>
</span>

      </p><div class="section" title="10.18.1.&#160;Class template basic_socket_streambuf"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_streambuf"></a>10.18.1.&#160;Class template <code class="literal">basic_socket_streambuf</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.streambuf"></a>
<a class="link" href="#socket.streambuf">[socket.streambuf]</a>
<a class="indexterm" name="idm168525575808"></a>
</span>
        </p><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">,</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">WaitTraits</span><span class="special">&gt;</span></code> associates both the input sequence
          and the output sequence with a socket. The input and output sequences do
          not support seeking. [<span class="emphasis"><em>Note:</em></span> The input and output sequences
          are independent as a stream socket provides full duplex I/O. &#8212;<span class="emphasis"><em>end
          note</em></span>]
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> This class is intended for sending and receiving
          bytes, not characters. The conversion from characters to bytes, and vice
          versa, must occur elsewhere. &#8212;<span class="emphasis"><em>end note</em></span>]
        </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">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="special">{</span>
      <span class="keyword">public</span><span class="special">:</span>
        <span class="comment">// types:</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_type</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">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_type</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_type</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="identifier">WaitTraits</span> <span class="identifier">traits_type</span><span class="special">;</span>

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

        <span class="identifier">basic_socket_streambuf</span><span class="special">();</span>
        <span class="keyword">explicit</span> <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">);</span>
        <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_socket_streambuf</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_socket_streambuf</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</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="identifier">basic_socket_streambuf</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_streambuf</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_streambuf</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_streambuf</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>

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

        <span class="identifier">basic_socket_streambuf</span><span class="special">*</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">*</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_type</span><span class="special">&gt;*</span> <span class="identifier">close</span><span class="special">();</span>

        <span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</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">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="identifier">override</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="identifier">override</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="identifier">override</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="identifier">override</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="identifier">override</span><span class="special">;</span>

      <span class="keyword">private</span><span class="special">:</span>
        <span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</span> <span class="identifier">socket_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></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><div class="section" title="10.18.1.1.&#160;basic_socket_streambuf constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_streambuf__constructors"></a>10.18.1.1.&#160;<code class="literal">basic_socket_streambuf</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.streambuf.cons"></a>
<a class="link" href="#socket.streambuf.cons">[socket.streambuf.cons]</a>
<a class="indexterm" name="idm168520158816"></a>
</span>
          </p><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> Initializes <code class="computeroutput"><span class="identifier">socket_</span></code>
              with <code class="computeroutput"><span class="identifier">ios</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>.
            </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_type</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</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> Initializes <code class="computeroutput"><span class="identifier">socket_</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">s</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">expiry</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">clock_type</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_socket_streambuf</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 from the rvalue <code class="computeroutput"><span class="identifier">rhs</span></code>. It is implementation-defined
              whether the sequence pointers in <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (<code class="computeroutput"><span class="identifier">eback</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">gptr</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">egptr</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">pbase</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">pptr</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">epptr</span><span class="special">()</span></code>) obtain the values which <code class="computeroutput"><span class="identifier">rhs</span></code> had. Whether they do or not,
              <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              and <code class="computeroutput"><span class="identifier">rhs</span></code> reference separate
              buffers (if any at all) after the construction. Additionally <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              references the socket which <code class="computeroutput"><span class="identifier">rhs</span></code>
              did before the construction, and <code class="computeroutput"><span class="identifier">rhs</span></code>
              references no open socket after the construction.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> Let <code class="computeroutput"><span class="identifier">rhs_p</span></code>
              refer to the state of <code class="computeroutput"><span class="identifier">rhs</span></code>
              just prior to this construction and let <code class="computeroutput"><span class="identifier">rhs_a</span></code>
              refer to the state of <code class="computeroutput"><span class="identifier">rhs</span></code>
              just after this construction.<br> &#8212; <code class="computeroutput"><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="identifier">rhs_a</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><br>
              &#8212; <code class="computeroutput"><span class="identifier">expiry</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">expiry</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">clock_type</span><span class="special">::</span><span class="identifier">max</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="identifier">gptr</span><span class="special">()</span>
              <span class="special">-</span> <span class="identifier">eback</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">gptr</span><span class="special">()</span>
              <span class="special">-</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">eback</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">egptr</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">eback</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">egptr</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">eback</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="identifier">ptr</span><span class="special">()</span>
              <span class="special">-</span> <span class="identifier">pbase</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">pptr</span><span class="special">()</span>
              <span class="special">-</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">pbase</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="identifier">pptr</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">pbase</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">epptr</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">rhs_p</span><span class="special">.</span><span class="identifier">pbase</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">eback</span><span class="special">())</span>
              <span class="identifier">eback</span><span class="special">()</span>
              <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">eback</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="keyword">if</span>
              <span class="special">(</span><span class="identifier">gptr</span><span class="special">())</span> <span class="identifier">gptr</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">gptr</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">egptr</span><span class="special">())</span>
              <span class="identifier">egptr</span><span class="special">()</span>
              <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">egptr</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="keyword">if</span>
              <span class="special">(</span><span class="identifier">pbase</span><span class="special">())</span> <span class="identifier">pbase</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">pbase</span><span class="special">()</span></code><br>
              &#8212; <code class="computeroutput"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">pptr</span><span class="special">())</span>
              <span class="identifier">pptr</span><span class="special">()</span>
              <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">pptr</span><span class="special">()</span></code><br> &#8212; <code class="computeroutput"><span class="keyword">if</span>
              <span class="special">(</span><span class="identifier">epptr</span><span class="special">())</span> <span class="identifier">epptr</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">rhs_a</span><span class="special">.</span><span class="identifier">epptr</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> 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_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</span></code> destructor. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_streambuf</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="keyword">this</span><span class="special">-&gt;</span><span class="identifier">close</span><span class="special">()</span></code> then move assigns from <code class="computeroutput"><span class="identifier">rhs</span></code>. After the move assignment <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              has the observable state it would have had if it had been move constructed
              from <code class="computeroutput"><span class="identifier">rhs</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="10.18.1.2.&#160;basic_socket_streambuf members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_streambuf__members"></a>10.18.1.2.&#160;<code class="literal">basic_socket_streambuf</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.streambuf.members"></a>
<a class="link" href="#socket.streambuf.members">[socket.streambuf.members]</a>
<a class="indexterm" name="idm168521154704"></a>
</span>
          </p><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">&lt;</span><span class="identifier">protocol_type</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 and re-opens the socket by performing <code class="computeroutput"><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec_</span><span class="special">)</span></code>
              and <code class="computeroutput"><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">open</span><span class="special">(</span><span class="identifier">e</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 attempts to establish a connection as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a><span class="special">(</span><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">sockaddr</span><span class="special">*&gt;(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">()),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span></code>. <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">timed_out</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">*</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> Resets the <code class="computeroutput"><span class="identifier">streambuf</span></code>
              get and put areas and closes the socket as if by calling <code class="computeroutput"><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec_</span><span class="special">)</span></code>.
              Obtains an endpoint sequence <code class="computeroutput"><span class="identifier">endpoints</span></code>
              by performing <code class="computeroutput"><span class="identifier">protocol_type</span><span class="special">::</span><span class="identifier">resolver</span><span class="special">(</span><span class="identifier">ios</span><span class="special">).</span><span class="identifier">resolve</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>,
              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>.
              For each endpoint <code class="computeroutput"><span class="identifier">e</span></code>
              in the sequence, closes and re-opens the socket by performing <code class="computeroutput"><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">close</span><span class="special">(</span><span class="identifier">ec_</span><span class="special">)</span></code>
              and <code class="computeroutput"><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">open</span><span class="special">(</span><span class="identifier">e</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 attempts to establish a connection as if by POSIX <code class="computeroutput"><a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top">connect</a><span class="special">(</span><span class="identifier">socket_</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">(),</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">sockaddr</span><span class="special">*&gt;(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">()),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span></code>. <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">timed_out</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><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">Protocol</span></code>
              meets the requirements for an <a class="link" href="#requirements.internet_protocol" title="10.20.2.1.&#160;Internet protocol requirements">internet
              protocol</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket_streambuf</span><span class="special">*</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="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</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">basic_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</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">socket_</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">ec_</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> Equivalent to <code class="computeroutput"><span class="identifier">expires_at</span><span class="special">(</span><span class="identifier">clock_type</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="10.18.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>10.18.1.3.&#160;<code class="literal">basic_socket_streambuf</code> overridden virtual functions</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.streambuf.virtual"></a>
<a class="link" href="#socket.streambuf.virtual">[socket.streambuf.virtual]</a>
<a class="indexterm" name="idm168522595776"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">int_type</span> <span class="identifier">underflow</span><span class="special">()</span> <span class="identifier">override</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html" target="_top">recvmsg</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">timed_out</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> <span class="identifier">override</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> <span class="identifier">override</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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html" target="_top">sendmsg</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">timed_out</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> <span class="identifier">override</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> <span class="identifier">override</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="keyword">nullptr</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></div></div><div class="section" title="10.18.2.&#160;Class template basic_socket_iostream"><div class="titlepage"><div><div><h4 class="title"><a name="classes.basic_socket_iostream"></a>10.18.2.&#160;Class template <code class="literal">basic_socket_iostream</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.iostream"></a>
<a class="link" href="#socket.iostream">[socket.iostream]</a>
<a class="indexterm" name="idm168522455808"></a>
</span>
        </p><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 on 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.
        </p><p>
          [<span class="emphasis"><em>Note:</em></span> This class is intended for sending and receiving
          bytes, not characters. The conversion from characters to bytes, and vice
          versa, must occur elsewhere. &#8212;<span class="emphasis"><em>end note</em></span>]
        </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">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="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_type</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">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_type</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_type</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="identifier">WaitTraits</span> <span class="identifier">traits_type</span><span class="special">;</span>

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

        <span class="identifier">basic_socket_iostream</span><span class="special">();</span>
        <span class="keyword">explicit</span> <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">);</span>
        <span class="identifier">basic_socket_iostream</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_socket_iostream</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_iostream</span><span class="special">(</span><span class="identifier">basic_socket_iostream</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="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="identifier">basic_socket_iostream</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_iostream</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="identifier">basic_socket_iostream</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_iostream</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</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_type</span><span class="special">,</span> <span class="identifier">clock_type</span><span class="special">,</span> <span class="identifier">traits_type</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">basic_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</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_type</span><span class="special">,</span> <span class="identifier">clock_type</span><span class="special">,</span> <span class="identifier">traits_type</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><div class="section" title="10.18.2.1.&#160;basic_socket_iostream constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_iostream__constructors"></a>10.18.2.1.&#160;<code class="literal">basic_socket_iostream</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.iostream.cons"></a>
<a class="link" href="#socket.iostream.cons">[socket.iostream.cons]</a>
<a class="indexterm" name="idm168523407520"></a>
</span>
          </p><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> Initializes the base class as <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>,
              <code class="computeroutput"><span class="identifier">sb_</span></code> as <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 performs <code class="computeroutput"><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">explicit</span> <span class="identifier">basic_socket_streambuf</span><span class="special">(</span><span class="identifier">basic_stream_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</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> Initializes the base class as <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>,
              <code class="computeroutput"><span class="identifier">sb_</span></code> as <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><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">s</span><span class="special">))</span></code>,
              and performs <code class="computeroutput"><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="identifier">basic_socket_iostream</span><span class="special">(</span><span class="identifier">basic_socket_iostream</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 from the rvalue <code class="computeroutput"><span class="identifier">rhs</span></code>. This is accomplished by move
              constructing the base class, and the contained <code class="computeroutput"><span class="identifier">basic_socket_streambuf</span></code>.
              Next <code class="computeroutput"><span class="identifier">basic_iostream</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">set_rdbuf</span><span class="special">(&amp;</span><span class="identifier">sb_</span><span class="special">)</span></code> is called to install the contained
              <code class="computeroutput"><span class="identifier">basic_socket_streambuf</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> Initializes the base class as <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>,
              initializes <code class="computeroutput"><span class="identifier">sb_</span></code> as
              <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 performs <code class="computeroutput"><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><pre class="programlisting"><span class="identifier">basic_socket_iostream</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_socket_iostream</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 assigns the base and members of
              <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
              from the base and corresponding members of <code class="computeroutput"><span class="identifier">rhs</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="10.18.2.2.&#160;basic_socket_iostream members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__basic_socket_iostream__members"></a>10.18.2.2.&#160;<code class="literal">basic_socket_iostream</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="socket.iostream.members"></a>
<a class="link" href="#socket.iostream.members">[socket.iostream.members]</a>
<a class="indexterm" name="idm168520097456"></a>
</span>
          </p><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_type</span><span class="special">,</span> <span class="identifier">clock_type</span><span class="special">,</span> <span class="identifier">traits_type</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_type</span><span class="special">,</span> <span class="identifier">clock_type</span><span class="special">,</span> <span class="identifier">traits_type</span><span class="special">&gt;*&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">sb_</span><span class="special">))</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_socket</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;&amp;</span> <span class="identifier">socket</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">socket</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">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">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> Equivalent to <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> Equivalent to <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="10.19.&#160;Socket algorithms"><div class="titlepage"><div><div><h3 class="title"><a name="network.socket_algorithms"></a>10.19.&#160;Socket algorithms</h3></div></div></div><p>
        <span class="xrefid">
<a name="socket.algo"></a>
<a class="link" href="#socket.algo">[socket.algo]</a>
<a class="indexterm" name="idm168518088336"></a>
</span>

      </p><div class="section" title="10.19.1.&#160;Synchronous connect operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.connect"></a>10.19.1.&#160;Synchronous connect operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.algo.connect"></a>
<a class="link" href="#socket.algo.connect">[socket.algo.connect]</a>
<a class="indexterm" name="idm168518083936"></a>
</span>
        </p><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">EndpointSequence</span><span class="special">&gt;</span>
  <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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">connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">endpoints</span><span class="special">,</span> []<span class="special">(</span><span class="keyword">auto</span><span class="special">,</span> <span class="keyword">auto</span><span class="special">){</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</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">EndpointSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ConnectCondition</span><span class="special">&gt;</span>
  <span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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>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 <code class="computeroutput"><span class="keyword">true</span></code>,
            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 element <code class="computeroutput"><span class="identifier">ep</span></code>
            in the sequence <code class="computeroutput"><span class="identifier">endpoints</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="identifier">ep</span><span class="special">)</span></code>
            yields <code class="computeroutput"><span class="keyword">true</span></code> 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">ep</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">)</span></code> succeeds. If no such element 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="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span><span class="special">()</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">endpoints</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>
            or if the function object <code class="computeroutput"><span class="identifier">c</span></code>
            returned <code class="computeroutput"><span class="keyword">false</span></code> for all elements
            in the sequence.
          </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>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">last</span><span class="special">,</span> []<span class="special">(</span><span class="keyword">auto</span><span class="special">,</span> <span class="keyword">auto</span><span class="special">){</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</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 <code class="computeroutput"><span class="keyword">true</span></code>,
            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> yields <code class="computeroutput"><span class="keyword">true</span></code>
            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 <code class="computeroutput"><span class="keyword">false</span></code> for all iterators in the range.
          </p></blockquote></div></div><div class="section" title="10.19.2.&#160;Asynchronous connect operations"><div class="titlepage"><div><div><h4 class="title"><a name="functions.async_connect"></a>10.19.2.&#160;Asynchronous connect operations</h4></div></div></div><p>
          <span class="xrefid">
<a name="socket.algo.async.connect"></a>
<a class="link" href="#socket.algo.async.connect">[socket.algo.async.connect]</a>
<a class="indexterm" name="idm168521093696"></a>
</span>
        </p><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">EndpointSequence</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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_connect</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">endpoints</span><span class="special">,</span> []<span class="special">(</span><span class="keyword">auto</span><span class="special">,</span> <span class="keyword">auto</span><span class="special">){</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</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="emphasis"><em>DEDUCED</em></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="keyword">const</span> <span class="identifier">EndpointSequence</span><span class="special">&amp;</span> <span class="identifier">endpoints</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="10.13.2.2.&#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="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span>
            <span class="identifier">ep</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 <code class="computeroutput"><span class="keyword">true</span></code>,
            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> yields <code class="computeroutput"><span class="keyword">true</span></code>.
            Initiates an asynchronous operation to determine the first element <code class="computeroutput"><span class="identifier">ep</span></code> in the sequence <code class="computeroutput"><span class="identifier">endpoints</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="identifier">ep</span><span class="special">)</span></code>
            yields <code class="computeroutput"><span class="keyword">true</span></code> 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">ep</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">ep</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 element is found, <code class="computeroutput"><span class="identifier">ec</span></code> contains <code class="computeroutput"><span class="identifier">previous_ec</span></code>
            and <code class="computeroutput"><span class="identifier">ep</span></code> is <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">Protocol</span><span class="special">::</span><span class="identifier">endpoint</span><span class="special">()</span></code>. [<span class="emphasis"><em>Note:</em></span> The underlying
            <code class="computeroutput"><span class="identifier">async_connect</span></code> operations
            are performed sequentially. &#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">socket_errc</span><span class="special">::</span><span class="identifier">not_found</span></code>
            &#8212; if <code class="computeroutput"><span class="identifier">endpoints</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code>
            or if the function object <code class="computeroutput"><span class="identifier">c</span></code>
            returned <code class="computeroutput"><span class="keyword">false</span></code> for all elements
            in the sequence.
          </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="emphasis"><em>DEDUCED</em></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>
            <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">last</span><span class="special">,</span> []<span class="special">(</span><span class="keyword">auto</span><span class="special">,</span> <span class="keyword">auto</span><span class="special">){</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</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="emphasis"><em>DEDUCED</em></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="10.13.2.2.&#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 <code class="computeroutput"><span class="keyword">true</span></code>,
            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> yields <code class="computeroutput"><span class="keyword">true</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 <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> yields <code class="computeroutput"><span class="keyword">true</span></code>
            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 <code class="computeroutput"><span class="identifier">previous_ec</span></code>
            and <code class="computeroutput"><span class="identifier">i</span></code> contains <code class="computeroutput"><span class="identifier">last</span></code>. [<span class="emphasis"><em>Note:</em></span> The
            underlying <code class="computeroutput"><span class="identifier">async_connect</span></code>
            operations are performed sequentially. &#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">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 <code class="computeroutput"><span class="keyword">false</span></code> for all iterators in the range.
          </p></blockquote></div></div></div><div class="section" title="10.20.&#160;Internet protocol"><div class="titlepage"><div><div><h3 class="title"><a name="network.internet_protocol"></a>10.20.&#160;Internet protocol</h3></div></div></div><p>
        <span class="xrefid">
<a name="internet"></a>
<a class="link" href="#internet">[internet]</a>
<a class="indexterm" name="idm168519911296"></a>
</span>

      </p><div class="section" title="10.20.1.&#160;Header &lt;experimental/internet&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_internet___synopsis"></a>10.20.1.&#160;Header <code class="literal">&lt;experimental/internet&gt;</code> synopsis</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.synop"></a>
<a class="link" href="#internet.synop">[internet.synop]</a>
<a class="indexterm" name="idm168519906240"></a>
</span>
        </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">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">typedef</span> <span class="identifier">uint16_least_t</span> <span class="identifier">port_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">uint32_least_t</span> <span class="identifier">address_v4_uint_type</span><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">uint32_least_t</span> <span class="identifier">scope_id_type</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="10.20.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="10.20.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="10.20.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="10.20.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="10.20.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="10.20.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="10.20.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="10.20.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="identifier">string_view</span><span class="special">);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="identifier">string_view</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="comment">// <a class="link" href="#classes.ip__address_v4__creation" title="10.20.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="identifier">address_v4_uint_type</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="identifier">string_view</span><span class="special">);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">string_view</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="comment">// <a class="link" href="#classes.ip__address_v6__creation" title="10.20.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="identifier">scope_id_type</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="identifier">string_view</span><span class="special">);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="identifier">string_view</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="comment">// <a class="link" href="#classes.ip__address__io" title="10.20.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="10.20.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="10.20.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="10.20.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">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="identifier">basic_address_iterator</span><span class="special">;</span> <span class="emphasis"><em>// not defined</em></span>
        <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_address_iterator" title="10.20.10.&#160;Class template ip::basic_address_iterator specializations">basic_address_iterator&lt;address_v4&gt;</a><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">basic_address_iterator</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;</span> <span class="identifier">address_v4_iterator</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_address_iterator" title="10.20.10.&#160;Class template ip::basic_address_iterator specializations">basic_address_iterator&lt;address_v6&gt;</a><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">basic_address_iterator</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;</span> <span class="identifier">address_v6_iterator</span><span class="special">;</span>

        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="identifier">basic_address_range</span><span class="special">;</span> <span class="emphasis"><em>// not defined</em></span>
        <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_address_range" title="10.20.11.&#160;Class template ip::basic_address_range specializations">basic_address_range&lt;address_v4&gt;</a><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">basic_address_range</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;</span> <span class="identifier">address_v4_range</span><span class="special">;</span>
        <span class="keyword">template</span><span class="special">&lt;&gt;</span> <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_address_range" title="10.20.11.&#160;Class template ip::basic_address_range specializations">basic_address_range&lt;address_v6&gt;</a><span class="special">;</span>
        <span class="keyword">typedef</span> <span class="identifier">basic_address_range</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;</span> <span class="identifier">address_v6_range</span><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__network_v4" title="10.20.12.&#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="10.20.13.&#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="10.20.12.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="10.20.13.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="10.20.12.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="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="identifier">string_view</span><span class="special">);</span>
        <span class="identifier">network_v4</span> <span class="identifier">make_network_v4</span><span class="special">(</span><span class="identifier">string_view</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="comment">// <a class="link" href="#classes.ip__network_v6__creation" title="10.20.13.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="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="identifier">string_view</span><span class="special">);</span>
        <span class="identifier">network_v6</span> <span class="identifier">make_network_v6</span><span class="special">(</span><span class="identifier">string_view</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="comment">// <a class="link" href="#classes.ip__network_v4__io" title="10.20.12.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="10.20.13.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="10.20.14.&#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">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="10.20.15.&#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>
          <span class="keyword">bool</span> <span class="keyword">operator</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;&amp;,</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;&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_resolver_entry</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_resolver_entry</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>
          <a class="link" href="#classes.ip__basic_resolver_results" title="10.20.16.&#160;Class template ip::basic_resolver_results">basic_resolver_results</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">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">basic_resolver_results</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_resolver_results</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_resolver_results</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_resolver_results</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_base" title="10.20.17.&#160;Class ip::resolver_base">resolver_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>
          <span class="keyword">class</span> <a class="link" href="#classes.ip__basic_resolver" title="10.20.18.&#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="10.20.19.&#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="10.20.19.&#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">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
            <a class="link" href="#functions.ip__host_name" title="10.20.19.&#160;Host name functions">host_name</a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&amp;)</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">Allocator</span><span class="special">&gt;</span>
          <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
            <a class="link" href="#functions.ip__host_name" title="10.20.19.&#160;Host name functions">host_name</a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="keyword">const</span><span class="special">;</span>

        <span class="keyword">class</span> <a class="link" href="#classes.ip__tcp" title="10.20.20.&#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="10.20.22.&#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="10.20.23.&#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="10.20.24.&#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="10.20.25.&#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="10.20.25.&#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="10.20.26.&#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="10.20.27.&#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="10.20.28.&#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><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="10.20.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><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><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><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="10.20.2.&#160;Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="network.internet_protocol_requirements"></a>10.20.2.&#160;Requirements</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.reqmts"></a>
<a class="link" href="#internet.reqmts">[internet.reqmts]</a>
<a class="indexterm" name="idm168517727216"></a>
</span>

        </p><div class="section" title="10.20.2.1.&#160;Internet protocol requirements"><div class="titlepage"><div><div><h5 class="title"><a name="requirements.internet_protocol"></a>10.20.2.1.&#160;Internet protocol requirements</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.reqmts.protocol"></a>
<a class="link" href="#internet.reqmts.protocol">[internet.reqmts.protocol]</a>
<a class="indexterm" name="idm168517722864"></a>
</span>
          </p><p>
            An internet protocol must meet the requirements for <a class="link" href="#requirements.acceptable_protocol" title="10.17.2.4.&#160;Acceptable protocol requirements">requirements.acceptable_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 (possibly const) value of type <code class="computeroutput"><span class="identifier">X</span></code>,
            and <code class="computeroutput"><span class="identifier">b</span></code> denotes a (possibly
            const) 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;30.&#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 <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> represent the same IP protocol
                      version, otherwise <code class="computeroutput"><span class="keyword">false</span></code>.
                    </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="10.20.3.&#160;Error codes"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__resolver_errc"></a>10.20.3.&#160;Error codes</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.resolver.err"></a>
<a class="link" href="#internet.resolver.err">[internet.resolver.err]</a>
<a class="indexterm" name="idm168517663008"></a>
</span>
        </p><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 <code class="computeroutput"><span class="identifier">error_category</span></code>.
          </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 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 returns 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="10.20.4.&#160;Class ip::address"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address"></a>10.20.4.&#160;Class <code class="literal">ip::address</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address"></a>
<a class="link" href="#internet.address">[internet.address]</a>
<a class="indexterm" name="idm168517620128"></a>
</span>
        </p><p>
          The class <code class="computeroutput"><span class="identifier">address</span></code> is a
          version-independent representation for an IP address. An object of class
          <code class="computeroutput"><span class="identifier">address</span></code> holds either an
          IPv4 address, an IPv6 address, or no valid address.
        </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">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_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="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">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">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">to_string</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="identifier">Allocator</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">address_v4</span> <span class="identifier">v4_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
          <span class="identifier">address_v6</span> <span class="identifier">v6_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></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="identifier">string_view</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="identifier">string_view</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="10.20.4.1.&#160;ip::address constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__constructors"></a>10.20.4.1.&#160;<code class="literal">ip::address</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.cons"></a>
<a class="link" href="#internet.address.cons">[internet.address.cons]</a>
<a class="indexterm" name="idm168517434128"></a>
</span>
          </p><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>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>, <code class="computeroutput"><span class="identifier">is_v6</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span></code>, and <code class="computeroutput"><span class="identifier">is_unspecified</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">true</span></code>.
            </p></blockquote></div><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>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">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="10.20.4.2.&#160;ip::address assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__assignment"></a>10.20.4.2.&#160;<code class="literal">ip::address</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.assign"></a>
<a class="link" href="#internet.address.assign">[internet.address.assign]</a>
<a class="indexterm" name="idm168517372784"></a>
</span>
          </p><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="10.20.4.3.&#160;ip::address members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address__members"></a>10.20.4.3.&#160;<code class="literal">ip::address</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.members"></a>
<a class="link" href="#internet.address.members">[internet.address.members]</a>
<a class="indexterm" name="idm168517354128"></a>
</span>
          </p><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, otherwise <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_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, otherwise <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_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></code>, returns <code class="computeroutput"><span class="identifier">v4_</span><span class="special">.</span><span class="identifier">is_unspecified</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">v6_</span><span class="special">.</span><span class="identifier">is_unspecified</span><span class="special">()</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></code>, returns <code class="computeroutput"><span class="identifier">v4_</span><span class="special">.</span><span class="identifier">is_loopback</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">v6_</span><span class="special">.</span><span class="identifier">is_loopback</span><span class="special">()</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></code>, returns <code class="computeroutput"><span class="identifier">v4_</span><span class="special">.</span><span class="identifier">is_multicast</span><span class="special">()</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">v6_</span><span class="special">.</span><span class="identifier">is_multicast</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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">to_string</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="identifier">Allocator</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></code>, returns <code class="computeroutput"><span class="identifier">v4_</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span></code>. Otherwise returns <code class="computeroutput"><span class="identifier">v6_</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.4.4.&#160;ip::address comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__comparisons"></a>10.20.4.4.&#160;<code class="literal">ip::address</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.comparisons"></a>
<a class="link" href="#internet.address.comparisons">[internet.address.comparisons]</a>
<a class="indexterm" name="idm168518984320"></a>
</span>
          </p><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> <br> &#8212; if <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">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>,
              <code class="computeroutput"><span class="keyword">false</span></code>;<br> &#8212; if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>,
              the result of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">v4_</span> <span class="special">==</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">v4_</span></code>;<br> &#8212; otherwise, the result
              of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">v6_</span> <span class="special">==</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">v6_</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> <br> &#8212; if <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">&amp;&amp;</span>
              <span class="special">!</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">true</span></code>;<br>
              &#8212; if <code class="computeroutput"><span class="special">!</span><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>,
              <code class="computeroutput"><span class="keyword">false</span></code>;<br> &#8212; if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>,
              the result of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">v4_</span> <span class="special">&lt;</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">v4_</span></code>;<br> &#8212; otherwise, the result
              of <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">v6_</span> <span class="special">&lt;</span>
              <span class="identifier">b</span><span class="special">.</span><span class="identifier">v6_</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="10.20.4.5.&#160;ip::address creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__creation"></a>10.20.4.5.&#160;<code class="literal">ip::address</code> creation</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.creation"></a>
<a class="link" href="#internet.address.creation">[internet.address.creation]</a>
<a class="indexterm" name="idm168518858240"></a>
</span>
          </p><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="identifier">string_view</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="identifier">string_view</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 textual 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="10.20.4.6.&#160;ip::address I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address__io"></a>10.20.4.6.&#160;<code class="literal">ip::address</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.io"></a>
<a class="link" href="#internet.address.io">[internet.address.io]</a>
<a class="indexterm" name="idm168518801440"></a>
</span>
          </p><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>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span>
              <span class="special">&lt;&lt;</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.5.&#160;Class ip::address_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_v4"></a>10.20.5.&#160;Class <code class="literal">ip::address_v4</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address.v4"></a>
<a class="link" href="#internet.address.v4">[internet.address.v4]</a>
<a class="indexterm" name="idm168518773200"></a>
</span>
        </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">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="identifier">address_v4_uint_type</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="identifier">address_v4_uint_type</span> <span class="identifier">to_uint</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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">to_string</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="identifier">Allocator</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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="identifier">address_v4_uint_type</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="identifier">string_view</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="identifier">string_view</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="10.20.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>10.20.5.1.&#160;Struct <code class="literal">ip::address_v4::bytes_type</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.bytes"></a>
<a class="link" href="#internet.address.v4.bytes">[internet.address.v4.bytes]</a>
<a class="indexterm" name="idm168518538352"></a>
</span>
          </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">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="10.20.5.2.&#160;ip::address_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__constructors"></a>10.20.5.2.&#160;<code class="literal">ip::address_v4</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.cons"></a>
<a class="link" href="#internet.address.v4.cons">[internet.address.v4.cons]</a>
<a class="indexterm" name="idm168518497024"></a>
</span>
          </p><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> <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span></code> yields <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>
              and <code class="computeroutput"><span class="identifier">to_uint</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="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>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">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span>
              <span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</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_uint</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="identifier">address_v4_uint_type</span> <span class="identifier">val</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">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">numeric_limits</span><span class="special">&lt;</span><span class="identifier">address_v4_uint_type</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</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_uint</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="10.20.5.3.&#160;ip::address_v4 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__assignment"></a>10.20.5.3.&#160;<code class="literal">ip::address_v4</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.assign"></a>
<a class="link" href="#internet.address.v4.assign">[internet.address.v4.assign]</a>
<a class="indexterm" name="idm168518380000"></a>
</span>
          </p><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="10.20.5.4.&#160;ip::address_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__members"></a>10.20.5.4.&#160;<code class="literal">ip::address_v4</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.members"></a>
<a class="link" href="#internet.address.v4.members">[internet.address.v4.members]</a>
<a class="indexterm" name="idm168518361312"></a>
</span>
          </p><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_uint</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_uint</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_uint</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_uint</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_uint</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_uint</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="10.5.2.&#160;network byte order">network byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">address_v4_uint_type</span> <span class="identifier">to_uint</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="10.5.1.&#160;host byte order">host byte order</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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">to_string</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="identifier">Allocator</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 successful, the textual representation
              of the address, determined as if by POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html" target="_top">inet_ntop</a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.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>10.20.5.5.&#160;<code class="literal">ip::address_v4</code> static members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.static"></a>
<a class="link" href="#internet.address.v4.static">[internet.address.v4.static]</a>
<a class="indexterm" name="idm168520857184"></a>
</span>
          </p><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_uint</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_uint</span><span class="special">())</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.5.6.&#160;ip::address_v4 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__comparisons"></a>10.20.5.6.&#160;<code class="literal">ip::address_v4</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.comparisons"></a>
<a class="link" href="#internet.address.v4.comparisons">[internet.address.v4.comparisons]</a>
<a class="indexterm" name="idm168520808784"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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_uint</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_uint</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</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_uint</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_uint</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</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">constexpr</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>
</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="10.20.5.7.&#160;ip::address_v4 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__creation"></a>10.20.5.7.&#160;<code class="literal">ip::address_v4</code> creation</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.creation"></a>
<a class="link" href="#internet.address.v4.creation">[internet.address.v4.creation]</a>
<a class="indexterm" name="idm168520713248"></a>
</span>
          </p><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="identifier">address_v4_uint_type</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>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 <code class="computeroutput"><span class="keyword">false</span></code>.
            </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="identifier">string_view</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="identifier">string_view</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 textual representation of
              an address into a corresponding <code class="computeroutput"><span class="identifier">address_v4</span></code>
              value, as if by POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/inet_pton.html" target="_top">inet_pton</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 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">str</span></code> is not a valid
              textual representation of an IPv4 address.
            </p></blockquote></div></div><div class="section" title="10.20.5.8.&#160;ip::address_v4 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__io"></a>10.20.5.8.&#160;<code class="literal">ip::address_v4</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v4.io"></a>
<a class="link" href="#internet.address.v4.io">[internet.address.v4.io]</a>
<a class="indexterm" name="idm168520617728"></a>
</span>
          </p><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>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span>
              <span class="special">&lt;&lt;</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.6.&#160;Class ip::address_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_v6"></a>10.20.6.&#160;Class <code class="literal">ip::address_v6</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address.v6"></a>
<a class="link" href="#internet.address.v6">[internet.address.v6]</a>
<a class="indexterm" name="idm168520589520"></a>
</span>
        </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">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="identifier">scope_id_type</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_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>

          <span class="comment">// members:</span>
          <span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="identifier">scope_id_type</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="identifier">scope_id_type</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="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">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">to_string</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="identifier">Allocator</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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">constexpr</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="identifier">scope_id_type</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="identifier">string_view</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="identifier">string_view</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="10.20.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>10.20.6.1.&#160;Struct <code class="literal">ip::address_v6::bytes_type</code></h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.bytes"></a>
<a class="link" href="#internet.address.v6.bytes">[internet.address.v6.bytes]</a>
<a class="indexterm" name="idm168520330592"></a>
</span>
          </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">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="10.20.6.2.&#160;ip::address_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__constructors"></a>10.20.6.2.&#160;<code class="literal">ip::address_v6</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.cons"></a>
<a class="link" href="#internet.address.v6.cons">[internet.address.v6.cons]</a>
<a class="indexterm" name="idm168520289296"></a>
</span>
          </p><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>Postconditions:</em></span> <code class="computeroutput"><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">scope_id</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="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>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="identifier">scope_id_type</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>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">numeric_limits</span><span class="special">&lt;</span><span class="keyword">unsigned</span>
              <span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</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="10.20.6.3.&#160;ip::address_v6 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__assignment"></a>10.20.6.3.&#160;<code class="literal">ip::address_v6</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.assign"></a>
<a class="link" href="#internet.address.v6.assign">[internet.address.v6.assign]</a>
<a class="indexterm" name="idm168517073232"></a>
</span>
          </p><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="10.20.6.4.&#160;ip::address_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__members"></a>10.20.6.4.&#160;<code class="literal">ip::address_v6</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.members"></a>
<a class="link" href="#internet.address.v6.members">[internet.address.v6.members]</a>
<a class="indexterm" name="idm168517054640"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="identifier">scope_id_type</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="identifier">scope_id_type</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> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="string">"::"</span><span class="special">)</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="keyword">this</span> <span class="special">==</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="string">"::1"</span><span class="special">)</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> 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> <code class="computeroutput"><span class="identifier">is_multicast</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="special">(</span><span class="identifier">to_bytes</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></code>.
            </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> <code class="computeroutput"><span class="identifier">is_multicast</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="special">(</span><span class="identifier">to_bytes</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></code>.
            </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> <code class="computeroutput"><span class="identifier">is_multicast</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="special">(</span><span class="identifier">to_bytes</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></code>.
            </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> <code class="computeroutput"><span class="identifier">is_multicast</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="special">(</span><span class="identifier">to_bytes</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></code>.
            </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> <code class="computeroutput"><span class="identifier">is_multicast</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
              <span class="special">(</span><span class="identifier">to_bytes</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></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="10.5.2.&#160;network byte order">network byte order</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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">to_string</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="identifier">Allocator</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 textual 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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html" target="_top">inet_ntop</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 textual 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 textual 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 textual representation
              of the address. Otherwise <code class="computeroutput"><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.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>10.20.6.5.&#160;<code class="literal">ip::address_v6</code> static members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.static"></a>
<a class="link" href="#internet.address.v6.static">[internet.address.v6.static]</a>
<a class="indexterm" name="idm168516772560"></a>
</span>
          </p><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> An address <code class="computeroutput"><span class="identifier">a</span></code>
              such that the <code class="computeroutput"><span class="identifier">a</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">a</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">0</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 <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_loopback</span><span class="special">()</span>
              <span class="special">==</span> <span class="keyword">true</span></code>
              and <code class="computeroutput"><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="number">0</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.6.6.&#160;ip::address_v6 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__comparisons"></a>10.20.6.6.&#160;<code class="literal">ip::address_v6</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.comparisons"></a>
<a class="link" href="#internet.address.v6.comparisons">[internet.address.v6.comparisons]</a>
<a class="indexterm" name="idm168516737792"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</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">constexpr</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>
</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">constexpr</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>
</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">constexpr</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>
</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">constexpr</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>
</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="10.20.6.7.&#160;ip::address_v6 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__creation"></a>10.20.6.7.&#160;<code class="literal">ip::address_v6</code> creation</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.creation"></a>
<a class="link" href="#internet.address.v6.creation">[internet.address.v6.creation]</a>
<a class="indexterm" name="idm168516625248"></a>
</span>
          </p><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="identifier">scope_id_type</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="identifier">string_view</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="identifier">string_view</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 textual 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 POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/inet_pton.html" target="_top">inet_pton</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 textual 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 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">str</span></code> is not a valid
              textual representation of an IPv6 address.
            </p></blockquote></div></div><div class="section" title="10.20.6.8.&#160;ip::address_v6 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__io"></a>10.20.6.8.&#160;<code class="literal">ip::address_v6</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.address.v6.io"></a>
<a class="link" href="#internet.address.v6.io">[internet.address.v6.io]</a>
<a class="indexterm" name="idm168516508656"></a>
</span>
          </p><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>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span>
              <span class="special">&lt;&lt;</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.7.&#160;Class ip::bad_address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__bad_address_cast"></a>10.20.7.&#160;Class <code class="literal">ip::bad_address_cast</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.bad.address.cast"></a>
<a class="link" href="#internet.bad.address.cast">[internet.bad.address.cast]</a>
<a class="indexterm" name="idm168516480432"></a>
</span>
        </p><p>
          An exception of type <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
          is thrown by a failed <code class="computeroutput"><span class="identifier">address_cast</span></code>.
        </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">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="comment">// constructor:</span>
          <span class="identifier">bad_address_cast</span><span class="special">()</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>

<span class="identifier">bad_address_cast</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_address_cast</span></code>
            object.
          </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">what</span><span class="special">()</span></code> returns an implementation-defined NTBS.
          </p></blockquote></div></div><div class="section" title="10.20.8.&#160;Function ip::address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="functions.ip__address_cast"></a>10.20.8.&#160;Function <code class="literal">ip::address_cast</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address.cast"></a>
<a class="link" href="#internet.address.cast">[internet.address.cast]</a>
<a class="indexterm" name="idm168516447184"></a>
</span>
        </p><div class="blockquote"><blockquote class="blockquote"><p>
            This implementation shall specialize <code class="computeroutput"><span class="identifier">address_cast</span></code>
            for the types <code class="computeroutput"><span class="identifier">T</span></code> listed
            in the tables below.
          </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">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="table"><a name="functions.proposed_text.internet_protocol.ip__address_cast.t0"></a><p class="title"><b>Table&#160;31.&#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 <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 <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;32.&#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;33.&#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="10.20.9.&#160;Hash support"><div class="titlepage"><div><div><h4 class="title"><a name="classes.hash"></a>10.20.9.&#160;Hash support</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.hash"></a>
<a class="link" href="#internet.hash">[internet.hash]</a>
<a class="indexterm" name="idm168516300432"></a>
</span>
        </p><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="10.20.10.&#160;Class template ip::basic_address_iterator specializations"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_address_iterator"></a>10.20.10.&#160;Class template <code class="literal">ip::basic_address_iterator</code> specializations</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address.iter"></a>
<a class="link" href="#internet.address.iter">[internet.address.iter]</a>
<a class="indexterm" name="idm168516272368"></a>
</span>
        </p><p>
          The class template <code class="computeroutput"><span class="identifier">basic_address_iterator</span></code>
          enables iteration over IP addresses in network byte order. This clause
          defines two specializations of the class template <code class="computeroutput"><span class="identifier">basic_address_iterator</span></code>:
          <code class="computeroutput"><span class="identifier">basic_address_iterator</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;</span></code> and <code class="computeroutput"><span class="identifier">basic_address_iterator</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;</span></code>. The members and operational semantics
          of these specializations are defined below.
        </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;&gt;</span> <span class="keyword">class</span> <span class="identifier">basic_address_iterator</span><span class="special">&lt;</span><span class="emphasis"><em>Address</em></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>Address</em></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="emphasis"><em>Address</em></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="emphasis"><em>Address</em></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">basic_address_iterator</span><span class="special">(</span><span class="keyword">const</span> <span class="emphasis"><em>Address</em></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="identifier">reference</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="identifier">pointer</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">basic_address_iterator</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">basic_address_iterator</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">basic_address_iterator</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">basic_address_iterator</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="emphasis"><em>Address</em></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>

<span class="identifier">basic_address_iterator</span><span class="special">(</span><span class="keyword">const</span> <span class="emphasis"><em>Address</em></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> Initializes <code class="computeroutput"><span class="identifier">address_</span></code>
            with <code class="computeroutput"><span class="identifier">a</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">reference</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="identifier">pointer</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="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">address_</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_address_iterator</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">basic_address_iterator</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">basic_address_iterator</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">basic_address_iterator</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 class="section" title="10.20.11.&#160;Class template ip::basic_address_range specializations"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_address_range"></a>10.20.11.&#160;Class template <code class="literal">ip::basic_address_range</code> specializations</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.address.range"></a>
<a class="link" href="#internet.address.range">[internet.address.range]</a>
<a class="indexterm" name="idm168516132464"></a>
</span>
        </p><p>
          The class template <code class="computeroutput"><span class="identifier">basic_address_range</span></code>
          represents a range of IP addresses in network byte order. This clause defines
          two specializations of the class template <code class="computeroutput"><span class="identifier">basic_address_range</span></code>:
          <code class="computeroutput"><span class="identifier">basic_address_range</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;</span></code>
          and <code class="computeroutput"><span class="identifier">basic_address_range</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;</span></code>. The members and operational semantics
          of these specializations are defined below.
        </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;&gt;</span> <span class="keyword">class</span> <span class="identifier">basic_address_range</span><span class="special">&lt;</span><span class="emphasis"><em>Address</em></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">basic_address_iterator</span><span class="special">&lt;</span><span class="emphasis"><em>Address</em></span><span class="special">&gt;</span> <span class="identifier">iterator</span><span class="special">;</span>

          <span class="comment">// constructors:</span>
          <span class="identifier">basic_address_range</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">basic_address_range</span><span class="special">(</span><span class="keyword">const</span> <span class="emphasis"><em>Address</em></span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                              <span class="keyword">const</span> <span class="emphasis"><em>Address</em></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="emphasis"><em>// not always defined</em></span>
          <span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="emphasis"><em>Address</em></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>

<span class="identifier">basic_address_range</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">basic_address_range</span><span class="special">&lt;</span></code><span class="emphasis"><em>Address</em></span><code class="computeroutput"><span class="special">&gt;</span></code> that represents an empty range.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_address_range</span><span class="special">(</span><span class="keyword">const</span> <span class="emphasis"><em>Address</em></span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
                    <span class="keyword">const</span> <span class="emphasis"><em>Address</em></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">basic_address_range</span><span class="special">&lt;</span></code><span class="emphasis"><em>Address</em></span><code class="computeroutput"><span class="special">&gt;</span></code> that represents 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><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><div class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Remarks:</em></span> This member function is not defined when
            <span class="emphasis"><em><code class="literal">Address</code></em></span> is type <code class="computeroutput"><span class="identifier">address_v6</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="emphasis"><em>Address</em></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 class="blockquote"><blockquote class="blockquote"><p>
            <span class="emphasis"><em>Complexity:</em></span> Constant time.
          </p></blockquote></div></div><div class="section" title="10.20.12.&#160;Class template ip::network_v4"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__network_v4"></a>10.20.12.&#160;Class template <code class="literal">ip::network_v4</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.network.v4"></a>
<a class="link" href="#internet.network.v4">[internet.network.v4]</a>
<a class="indexterm" name="idm168515988048"></a>
</span>
        </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">network_v4</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">network_v4</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</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="identifier">prefix_len</span><span class="special">);</span>
          <span class="keyword">constexpr</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="keyword">constexpr</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">constexpr</span> <span class="keyword">unsigned</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="keyword">constexpr</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="keyword">constexpr</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="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="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">address_v4_range</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="keyword">constexpr</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">constexpr</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">constexpr</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="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">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">to_string</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="identifier">Allocator</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">constexpr</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">constexpr</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="keyword">constexpr</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="identifier">prefix_len</span><span class="special">);</span>
        <span class="keyword">constexpr</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="identifier">string_view</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="identifier">string_view</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="10.20.12.1.&#160;ip::network_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v4__constructors"></a>10.20.12.1.&#160;<code class="literal">ip::network_v4</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v4.cons"></a>
<a class="link" href="#internet.network.v4.cons">[internet.network.v4.cons]</a>
<a class="indexterm" name="idm168515819600"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</span> <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="keyword">this</span><span class="special">-&gt;</span><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="keyword">constexpr</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="identifier">prefix_len</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="keyword">this</span><span class="special">-&gt;</span><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="keyword">constexpr</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>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><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="10.20.12.2.&#160;ip::network_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v4__members"></a>10.20.12.2.&#160;<code class="literal">ip::network_v4</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v4.members"></a>
<a class="link" href="#internet.network.v4.members">[internet.network.v4.members]</a>
<a class="indexterm" name="idm168515764064"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</span> <span class="keyword">unsigned</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="keyword">constexpr</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>
</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="keyword">constexpr</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>
</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="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">()</span></code>.
              All other bits are zero.
            </p></blockquote></div><pre class="programlisting"><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="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="keyword">this</span><span class="special">-&gt;</span><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_v4_range</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_v4_range</span></code>
              object representing the single address <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">().</span></code> Otherwise, an <code class="computeroutput"><span class="identifier">address_v4_range</span></code>
              object representing the range of unique host IP addresses in the network.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              [<span class="emphasis"><em>Note:</em></span> For IPv4, the network address and the broadcast
              address are not included in the range of host IP addresses. For example,
              given a network <code class="computeroutput"><span class="number">192.168</span><span class="special">.</span><span class="number">1.0</span><span class="special">/</span><span class="number">24</span></code>,
              the range returned by <code class="computeroutput"><span class="identifier">hosts</span><span class="special">()</span></code> is from <code class="computeroutput"><span class="number">192.168</span><span class="special">.</span><span class="number">1.1</span></code>
              to <code class="computeroutput"><span class="number">192.168</span><span class="special">.</span><span class="number">1.254</span></code> inclusive, and neither <code class="computeroutput"><span class="number">192.168</span><span class="special">.</span><span class="number">1.0</span></code> nor the broadcast address <code class="computeroutput"><span class="number">192.168</span><span class="special">.</span><span class="number">1.255</span></code> are in the range. &#8212;<span class="emphasis"><em>end
              note</em></span>]
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="number">32</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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="keyword">this</span><span class="special">-&gt;</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>,
              otherwise <code class="computeroutput"><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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">to_string</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="identifier">Allocator</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">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">+</span> <span class="string">"/"</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><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.12.3.&#160;ip::network_v4 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__comparisons"></a>10.20.12.3.&#160;<code class="literal">ip::network_v4</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v4.comparisons"></a>
<a class="link" href="#internet.network.v4.comparisons">[internet.network.v4.comparisons]</a>
<a class="indexterm" name="idm168515613504"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</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="10.20.12.4.&#160;ip::network_v4 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__creation"></a>10.20.12.4.&#160;<code class="literal">ip::network_v4</code> creation</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v4.creation"></a>
<a class="link" href="#internet.network.v4.creation">[internet.network.v4.creation]</a>
<a class="indexterm" name="idm168519555584"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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="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="keyword">constexpr</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>
</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="identifier">string_view</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="identifier">string_view</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></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 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">str</span></code> is not a valid
              textual representation of an IPv4 address and prefix length.
            </p></blockquote></div></div><div class="section" title="10.20.12.5.&#160;ip::network_v4 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v4__io"></a>10.20.12.5.&#160;<code class="literal">ip::network_v4</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v4.io"></a>
<a class="link" href="#internet.network.v4.io">[internet.network.v4.io]</a>
<a class="indexterm" name="idm168519484400"></a>
</span>
          </p><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>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span>
              <span class="special">&lt;&lt;</span> <span class="identifier">net</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.13.&#160;Class template ip::network_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__network_v6"></a>10.20.13.&#160;Class template <code class="literal">ip::network_v6</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.network.v6"></a>
<a class="link" href="#internet.network.v6">[internet.network.v6]</a>
<a class="indexterm" name="idm168519456160"></a>
</span>
        </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">network_v6</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">network_v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</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="identifier">prefix_len</span><span class="special">);</span>

          <span class="comment">// members:</span>
          <span class="keyword">constexpr</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">constexpr</span> <span class="keyword">unsigned</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="keyword">constexpr</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_v6_range</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="keyword">constexpr</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">constexpr</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">constexpr</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="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">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">to_string</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="identifier">Allocator</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">constexpr</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">constexpr</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="keyword">constexpr</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="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_v6</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_v6</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="10.20.13.1.&#160;ip::network_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v6__constructors"></a>10.20.13.1.&#160;<code class="literal">ip::network_v6</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v6.cons"></a>
<a class="link" href="#internet.network.v6.cons">[internet.network.v6.cons]</a>
<a class="indexterm" name="idm168519309520"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</span> <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="keyword">this</span><span class="special">-&gt;</span><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="keyword">constexpr</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="identifier">prefix_len</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="keyword">this</span><span class="special">-&gt;</span><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="10.20.13.2.&#160;ip::network_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__network_v6__members"></a>10.20.13.2.&#160;<code class="literal">ip::network_v6</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v6.members"></a>
<a class="link" href="#internet.network.v6.members">[internet.network.v6.members]</a>
<a class="indexterm" name="idm168519272384"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</span> <span class="keyword">unsigned</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="keyword">constexpr</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>
</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="keyword">this</span><span class="special">-&gt;</span><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_v6_range</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_v6_range</span></code>
              object representing the single address <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">().</span></code> Otherwise, an <code class="computeroutput"><span class="identifier">address_v6_range</span></code>
              object representing the range of unique host IP addresses in the network.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">prefix_length</span><span class="special">()</span> <span class="special">==</span> <span class="number">128</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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="keyword">this</span><span class="special">-&gt;</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>,
              otherwise <code class="computeroutput"><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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">to_string</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="identifier">Allocator</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">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span> <span class="special">+</span> <span class="string">"/"</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><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.13.3.&#160;ip::network_v6 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__comparisons"></a>10.20.13.3.&#160;<code class="literal">ip::network_v6</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v6.comparisons"></a>
<a class="link" href="#internet.network.v6.comparisons">[internet.network.v6.comparisons]</a>
<a class="indexterm" name="idm168514946848"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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>
</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">constexpr</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>
</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="10.20.13.4.&#160;ip::network_v6 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__creation"></a>10.20.13.4.&#160;<code class="literal">ip::network_v6</code> creation</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v6.creation"></a>
<a class="link" href="#internet.network.v6.creation">[internet.network.v6.creation]</a>
<a class="indexterm" name="idm168514903488"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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="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_v6</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_v6</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></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 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">str</span></code> is not a valid
              textual representation of an IPv6 address and prefix length.
            </p></blockquote></div></div><div class="section" title="10.20.13.5.&#160;ip::network_v6 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__network_v6__io"></a>10.20.13.5.&#160;<code class="literal">ip::network_v6</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.network.v6.io"></a>
<a class="link" href="#internet.network.v6.io">[internet.network.v6.io]</a>
<a class="indexterm" name="idm168514843664"></a>
</span>
          </p><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>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span>
              <span class="special">&lt;&lt;</span> <span class="identifier">net</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.14.&#160;Class template ip::basic_endpoint"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_endpoint"></a>10.20.14.&#160;Class template <code class="literal">ip::basic_endpoint</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.endpoint"></a>
<a class="link" href="#internet.endpoint">[internet.endpoint]</a>
<a class="indexterm" name="idm168514815536"></a>
</span>
        </p><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="10.17.2.2.&#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="keyword">constexpr</span> <span class="identifier">basic_endpoint</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
                                   <span class="identifier">port_type</span> <span class="identifier">port_num</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</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="identifier">port_type</span> <span class="identifier">port_num</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="identifier">protocol_type</span> <span class="identifier">protocol</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">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="keyword">noexcept</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">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</span> <span class="identifier">port_type</span> <span class="identifier">port</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">void</span> <span class="identifier">port</span><span class="special">(</span><span class="identifier">port_type</span> <span class="identifier">port_num</span><span class="special">)</span> <span class="keyword">noexcept</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">constexpr</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">noexcept</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">constexpr</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">noexcept</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">constexpr</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">noexcept</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">constexpr</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">noexcept</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">constexpr</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">noexcept</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">constexpr</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="keyword">noexcept</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 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="keyword">void</span><span class="special">*</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">noexcept</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="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="keyword">constexpr</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="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="keyword">constexpr</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="emphasis"><em>// remainder unchanged</em></span>
        <span class="keyword">private</span><span class="special">:</span>
          <span class="keyword">union</span>
          <span class="special">{</span>
            <span class="identifier">sockaddr_in</span> <span class="identifier">v4_</span><span class="special">;</span>
            <span class="identifier">sockaddr_in6</span> <span class="identifier">v6_</span><span class="special">;</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="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="10.20.14.1.&#160;ip::basic_endpoint constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__constructors"></a>10.20.14.1.&#160;<code class="literal">ip::basic_endpoint</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.endpoint.cons"></a>
<a class="link" href="#internet.endpoint.cons">[internet.endpoint.cons]</a>
<a class="indexterm" name="idm168514589712"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">basic_endpoint</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="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span><span class="special">()</span></code>
              and <code class="computeroutput"><span class="identifier">port</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="identifier">basic_endpoint</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol_type</span><span class="special">&amp;</span> <span class="identifier">proto</span><span class="special">,</span>
                         <span class="identifier">port_type</span> <span class="identifier">port_num</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">proto</span>
              <span class="special">==</span> <span class="identifier">protocol_type</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span> <span class="special">||</span> <span class="identifier">proto</span> <span class="special">==</span>
              <span class="identifier">protocol_type</span><span class="special">::</span><span class="identifier">v6</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; If <code class="computeroutput"><span class="identifier">proto</span>
              <span class="special">==</span> <span class="identifier">protocol_type</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">()</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>;
              otherwise, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</span><span class="special">()</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>.<br> &#8212; <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><pre class="programlisting"><span class="keyword">constexpr</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="identifier">port_type</span> <span class="identifier">port_num</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="keyword">this</span><span class="special">-&gt;</span><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">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="10.20.14.2.&#160;ip::basic_endpoint members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__members"></a>10.20.14.2.&#160;<code class="literal">ip::basic_endpoint</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.endpoint.members"></a>
<a class="link" href="#internet.endpoint.members">[internet.endpoint.members]</a>
<a class="indexterm" name="idm168514518240"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</span> <span class="identifier">protocol_type</span> <span class="identifier">protocol</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">protocol_type</span><span class="special">::</span><span class="identifier">v6</span><span class="special">()</span></code> if the expression <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">address</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>,
              otherwise <code class="computeroutput"><span class="identifier">protocol_type</span><span class="special">::</span><span class="identifier">v4</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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="keyword">noexcept</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> <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="keyword">this</span><span class="special">-&gt;</span><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">constexpr</span> <span class="identifier">port_type</span> <span class="identifier">port</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 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="identifier">port_type</span> <span class="identifier">port_num</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">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="10.20.14.3.&#160;ip::basic_endpoint comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__comparisons"></a>10.20.14.3.&#160;<code class="literal">ip::basic_endpoint</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.endpoint.comparisons"></a>
<a class="link" href="#internet.endpoint.comparisons">[internet.endpoint.comparisons]</a>
<a class="indexterm" name="idm168514462560"></a>
</span>
          </p><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">constexpr</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">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">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">constexpr</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">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">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">constexpr</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">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">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">constexpr</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">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">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">constexpr</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">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">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">constexpr</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="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="10.20.14.4.&#160;ip::basic_endpoint I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_endpoint__i_o"></a>10.20.14.4.&#160;<code class="literal">ip::basic_endpoint</code> I/O</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.endpoint.io"></a>
<a class="link" href="#internet.endpoint.io">[internet.endpoint.io]</a>
<a class="indexterm" name="idm168518209216"></a>
</span>
          </p><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_type</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="string">"["</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="special">&lt;&lt;</span> <span class="string">"]"</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="string">":"</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="10.20.14.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>10.20.14.5.&#160;<code class="literal">ip::basic_endpoint</code> members (extensible implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.endpoint.extensible"></a>
<a class="link" href="#internet.endpoint.extensible">[internet.endpoint.extensible]</a>
<a class="indexterm" name="idm168513938192"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">void</span><span class="special">*</span> <span class="identifier">data</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">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">data_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><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="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">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">data_</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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_INET6</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_INET4</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 <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">constexpr</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>
</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="10.20.15.&#160;Class template ip::basic_resolver_entry"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver_entry"></a>10.20.15.&#160;Class template <code class="literal">ip::basic_resolver_entry</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.resolver.entry"></a>
<a class="link" href="#internet.resolver.entry">[internet.resolver.entry]</a>
<a class="indexterm" name="idm168515560048"></a>
</span>
        </p><p>
          An object of type <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> represents a single element in the
          results returned by a name resolution operation.
        </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_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="identifier">string_view</span> <span class="identifier">h</span><span class="special">,</span>
                               <span class="identifier">string_view</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="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">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">host_name</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="identifier">Allocator</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">Allocator</span> <span class="special">=</span> <span class="identifier">allocator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;&gt;</span>
            <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
              <span class="identifier">service_name</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="identifier">Allocator</span><span class="special">())</span> <span class="keyword">const</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// basic_resolver_entry 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_resolver_entry</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_resolver_entry</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_resolver_entry</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_resolver_entry</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="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="10.20.15.1.&#160;ip::basic_resolver_entry constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_entry__constructors"></a>10.20.15.1.&#160;<code class="literal">ip::basic_resolver_entry</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.entry.cons"></a>
<a class="link" href="#internet.resolver.entry.cons">[internet.resolver.entry.cons]</a>
<a class="indexterm" name="idm168515452976"></a>
</span>
          </p><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> Equivalent to <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><span class="identifier">endpoint_type</span><span class="special">(),</span> <span class="string">""</span><span class="special">,</span> <span class="string">""</span><span class="special">)</span></code>.
            </p></blockquote></div><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="identifier">string_view</span> <span class="identifier">h</span><span class="special">,</span>
                     <span class="identifier">string_view</span> <span class="identifier">s</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <br> &#8212; <code class="computeroutput"><span class="identifier">endpoint</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">ep</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">host_name</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">h</span></code>.<br> &#8212; <code class="computeroutput"><span class="identifier">service_name</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">s</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.15.2.&#160;ip::basic_resolver_entry members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_entry__members"></a>10.20.15.2.&#160;<code class="literal">ip::basic_resolver_entry</code> members</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.entry.members"></a>
<a class="link" href="#internet.resolver.entry.members">[internet.resolver.entry.members]</a>
<a class="indexterm" name="idm168515420480"></a>
</span>
          </p><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="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">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">host_name</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="identifier">Allocator</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="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">char</span><span class="special">&gt;&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">service_name</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="identifier">Allocator</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 class="section" title="10.20.15.3.&#160;op::basic_resolver_entry comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__op__basic_resolver_entry__comparisons"></a>10.20.15.3.&#160;<code class="literal">op::basic_resolver_entry</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.entry.comparisons"></a>
<a class="link" href="#internet.resolver.entry.comparisons">[internet.resolver.entry.comparisons]</a>
<a class="indexterm" name="idm168515366784"></a>
</span>
          </p><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_resolver_entry</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_resolver_entry</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">endpoint</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">endpoint</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">host_name</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">host_name</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">service_name</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">service_name</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_resolver_entry</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_resolver_entry</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></div></div><div class="section" title="10.20.16.&#160;Class template ip::basic_resolver_results"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver_results"></a>10.20.16.&#160;Class template <code class="literal">ip::basic_resolver_results</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.resolver.results"></a>
<a class="link" href="#internet.resolver.results">[internet.resolver.results]</a>
<a class="indexterm" name="idm168515313456"></a>
</span>
        </p><p>
          An object of type <code class="computeroutput"><span class="identifier">basic_resolver_results</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span></code> represents 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>
          elements resulting from a single name resolution operation.
        </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_resolver_results</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">protocol_type</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_entry</span><span class="special">&lt;</span><span class="identifier">protocol_type</span><span class="special">&gt;</span> <span class="identifier">value_type</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">const_reference</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">value_type</span><span class="special">&amp;</span> <span class="identifier">reference</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="emphasis"><em>implementation-defined</em></span> <span class="identifier">const_iterator</span><span class="special">;</span>
          <span class="keyword">typedef</span> <span class="identifier">const_iterator</span> <span class="identifier">iterator</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="identifier">size_t</span> <span class="identifier">size_type</span><span class="special">;</span>

          <span class="comment">// construct / copy / destroy:</span>
          <span class="identifier">basic_resolver_results</span><span class="special">();</span>
          <span class="identifier">basic_resolver_results</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
          <span class="identifier">basic_resolver_results</span><span class="special">(</span><span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">basic_resolver_results</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_results</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
          <span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_resolver_results</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_results</span><span class="special">();</span>

          <span class="comment">// size:</span>
          <span class="identifier">size_type</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_type</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="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="comment">// element access:</span>
          <span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</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="special">;</span>
          <span class="identifier">const_iterator</span> <span class="identifier">cbegin</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">const_iterator</span> <span class="identifier">cend</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

          <span class="comment">// swap:</span>
          <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">that</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// basic_resolver_results 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_resolver_results</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_resolver_results</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_resolver_results</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_resolver_results</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="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 class template <code class="computeroutput"><span class="identifier">basic_resolver_results</span></code>
          satisfies the requirements of a sequence container (C++Std [sequence.reqmts]),
          except that only the operations defined for const-qualified sequence containers
          are supported. The class template <code class="computeroutput"><span class="identifier">basic_resolver_results</span></code>
          supports forward iterators.
        </p><p>
          A default-constructed <code class="computeroutput"><span class="identifier">basic_resolver_results</span></code>
          object is empty. A non-empty results object is obtained only by calling
          a <code class="computeroutput"><span class="identifier">basic_resolver</span></code> object's
          <code class="computeroutput"><span class="identifier">wait</span></code> or <code class="computeroutput"><span class="identifier">async_wait</span></code>
          operations, or otherwise by copy construction, move construction, assignment,
          or swap from another non-empty results object.
        </p><div class="section" title="10.20.16.1.&#160;ip::basic_resolver_results constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__constructors"></a>10.20.16.1.&#160;<code class="literal">ip::basic_resolver_results</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.cons"></a>
<a class="link" href="#internet.resolver.results.cons">[internet.resolver.results.cons]</a>
<a class="indexterm" name="idm168515174480"></a>
</span>
          </p><pre class="programlisting"><span class="identifier">basic_resolver_results</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">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_resolver_results</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">rhs</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">rhs</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">basic_resolver_results</span><span class="special">(</span><span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">rhs</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">rhs</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.16.2.&#160;ip::basic_resolver_results assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__assignment"></a>10.20.16.2.&#160;<code class="literal">ip::basic_resolver_results</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.assign"></a>
<a class="link" href="#internet.resolver.results.assign">[internet.resolver.results.assign]</a>
<a class="indexterm" name="idm168515145952"></a>
</span>
          </p><pre class="programlisting"><span class="identifier">basic_resolver_results</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_results</span><span class="special">&amp;</span> <span class="identifier">rhs</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">rhs</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">basic_resolver_results</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">rhs</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">rhs</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="10.20.16.3.&#160;ip::basic_resolver_results size"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__size"></a>10.20.16.3.&#160;<code class="literal">ip::basic_resolver_results</code> size</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.size"></a>
<a class="link" href="#internet.resolver.results.size">[internet.resolver.results.size]</a>
<a class="indexterm" name="idm168515115408"></a>
</span>
          </p><pre class="programlisting"><span class="identifier">size_type</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 <code class="computeroutput"><span class="identifier">basic_resolver_entry</span></code>
              elements in <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">size_type</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> The maximum number of <code class="computeroutput"><span class="identifier">basic_resolver_entry</span></code>
              elements that can be stored in <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </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="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.16.4.&#160;ip::basic_resolver_results element access"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__element_access"></a>10.20.16.4.&#160;<code class="literal">ip::basic_resolver_results</code> element access</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.access"></a>
<a class="link" href="#internet.resolver.results.access">[internet.resolver.results.access]</a>
<a class="indexterm" name="idm168515085824"></a>
</span>
          </p><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="special">;</span>
<span class="identifier">const_iterator</span> <span class="identifier">cbegin</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 starting iterator that enumerates over
              all the <code class="computeroutput"><span class="identifier">basic_resolver_entry</span></code>
              elements stored in <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </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="special">;</span>
<span class="identifier">const_iterator</span> <span class="identifier">cend</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 terminating iterator that enumerates
              over all the <code class="computeroutput"><span class="identifier">basic_resolver_entry</span></code>
              elements stored in <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.16.5.&#160;ip::basic_resolver_results swap"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__swap"></a>10.20.16.5.&#160;<code class="literal">ip::basic_resolver_results</code> swap</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.swap"></a>
<a class="link" href="#internet.resolver.results.swap">[internet.resolver.results.swap]</a>
<a class="indexterm" name="idm168515059776"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">basic_resolver_results</span><span class="special">&amp;</span> <span class="identifier">that</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">that</span></code>, and <code class="computeroutput"><span class="identifier">that</span></code> is equal to the prior value
              of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
            </p></blockquote></div></div><div class="section" title="10.20.16.6.&#160;ip::basic_resolver_results comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver_results__comparisons"></a>10.20.16.6.&#160;<code class="literal">ip::basic_resolver_results</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.results.comparisons"></a>
<a class="link" href="#internet.resolver.results.comparisons">[internet.resolver.results.comparisons]</a>
<a class="indexterm" name="idm168515042240"></a>
</span>
          </p><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_resolver_results</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_resolver_results</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">size</span><span class="special">()</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">&amp;&amp;</span> <span class="identifier">equal</span><span class="special">(</span><span class="identifier">a</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">(),</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">cend</span><span class="special">(),</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">cbegin</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_resolver_results</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_resolver_results</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></div></div><div class="section" title="10.20.17.&#160;Class ip::resolver_base"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__resolver_base"></a>10.20.17.&#160;Class <code class="literal">ip::resolver_base</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.resolver.base"></a>
<a class="link" href="#internet.resolver.base">[internet.resolver.base]</a>
<a class="indexterm" name="idm168512878608"></a>
</span>
        </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">resolver_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_base</span><span class="special">();</span>
          <span class="special">~</span><span class="identifier">resolver_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_base</span></code> defines a
          bitmask type, <code class="computeroutput"><span class="identifier">flags</span></code>, with
          the bitmask elements shown above.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__resolver_base.t0"></a><p class="title"><b>Table&#160;34.&#160;resolver flags</b></p><div class="table-contents"><table class="table" summary="resolver flags"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    Constant name
                  </p>
                </th><th>
                  <p>
                    POSIX macro
                  </p>
                </th><th>
                  <p>
                    Definition or notes
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">passive</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_PASSIVE</span></code>
                  </p>
                </td><td>
                  <p>
                    Returned endpoints are intended for use as locally bound socket
                    endpoints.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">canonical_name</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_CANONNAME</span></code>
                  </p>
                </td><td>
                  <p>
                    Determine the canonical name of the host specified in the query.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">numeric_host</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_NUMERICHOST</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></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">numeric_service</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_NUMERICSERV</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></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">v4_mapped</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_V4MAPPED</span></code>
                  </p>
                </td><td>
                  <p>
                    If the protocol is specified as an IPv6 protocol, return IPv4-mapped
                    IPv6 addresses on finding no IPv6 addresses.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">all_matching</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_ALL</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></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_configured</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AI_ADDRCONFIG</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></tr></tbody></table></div></div><br class="table-break"></div><div class="section" title="10.20.18.&#160;Class template ip::basic_resolver"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__basic_resolver"></a>10.20.18.&#160;Class template <code class="literal">ip::basic_resolver</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.resolver"></a>
<a class="link" href="#internet.resolver">[internet.resolver]</a>
<a class="indexterm" name="idm168512786896"></a>
</span>
        </p><p>
          Objects of type <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> are used to perform name resolution.
          Name resolution is the translation of a host name and service name into
          a sequence of endpoints, or the translation of an endpoint into its corresponding
          host name and service name.
        </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_resolver</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">resolver_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="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_results</span><span class="special">&lt;</span><span class="identifier">InternetProtocol</span><span class="special">&gt;</span> <span class="identifier">results_type</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="keyword">noexcept</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">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</span><span class="special">);</span>
          <span class="identifier">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">CompletionToken</span><span class="special">&gt;</span>
            <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

          <span class="identifier">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</span><span class="special">);</span>
          <span class="identifier">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">CompletionToken</span><span class="special">&gt;</span>
            <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">CompletionToken</span><span class="special">&amp;&amp;</span> <span class="identifier">token</span><span class="special">);</span>

          <span class="identifier">results_type</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">results_type</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="emphasis"><em>DEDUCED</em></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="10.20.18.1.&#160;ip::basic_resolver constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__constructors"></a>10.20.18.1.&#160;<code class="literal">ip::basic_resolver</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.cons"></a>
<a class="link" href="#internet.resolver.cons">[internet.resolver.cons]</a>
<a class="indexterm" name="idm168513898352"></a>
</span>
          </p><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>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> <span class="keyword">noexcept</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="10.20.18.2.&#160;ip::basic_resolver destructor"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__destructor"></a>10.20.18.2.&#160;<code class="literal">ip::basic_resolver</code> destructor</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.dtor"></a>
<a class="link" href="#internet.resolver.dtor">[internet.resolver.dtor]</a>
<a class="indexterm" name="idm168513867632"></a>
</span>
          </p><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, canceling all
              asynchronous operations associated with this 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="10.20.18.3.&#160;ip::basic_resolver assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__assignment"></a>10.20.18.3.&#160;<code class="literal">ip::basic_resolver</code> assignment</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.assign"></a>
<a class="link" href="#internet.resolver.assign">[internet.resolver.assign]</a>
<a class="indexterm" name="idm168513857424"></a>
</span>
          </p><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 all 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="10.20.18.4.&#160;ip::basic_resolver operations"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__basic_resolver__operations"></a>10.20.18.4.&#160;<code class="literal">ip::basic_resolver</code> operations</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.resolver.ops"></a>
<a class="link" href="#internet.resolver.ops">[internet.resolver.ops]</a>
<a class="indexterm" name="idm168513831664"></a>
</span>
          </p><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> Cancels all outstanding asynchronous
              resolve operations associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Completion handlers for canceled
              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> yields <code class="computeroutput"><span class="keyword">true</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</span><span class="special">);</span>
<span class="identifier">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">resolve</span><span class="special">(</span><span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">resolver_base</span><span class="special">::</span><span class="identifier">flags</span><span class="special">(),</span> <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">results_type</span> <span class="identifier">resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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">host_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>, let <code class="literal">H</code> be
              an NTBS constructed from <code class="computeroutput"><span class="identifier">host_name</span></code>;
              otherwise, let <code class="literal">H</code> be <code class="computeroutput"><span class="keyword">nullptr</span></code>.
              If <code class="computeroutput"><span class="identifier">service_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
              <span class="special">!=</span> <span class="keyword">nullptr</span></code>,
              let <code class="literal">S</code> be an NTBS constructed from <code class="computeroutput"><span class="identifier">service_name</span></code>; otherwise, let <code class="literal">S</code>
              be <code class="computeroutput"><span class="keyword">nullptr</span></code>. Resolves a
              host name and service name, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">addrinfo</span> <span class="identifier">hints</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_flags</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">f</span><span class="special">);</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_family</span> <span class="special">=</span> <span class="identifier">AF_UNSPEC</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_socktype</span> <span class="special">=</span> <span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">type</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_protocol</span> <span class="special">=</span> <span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addr</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addrlen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_canonname</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_next</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">addrinfo</span><span class="special">*</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html" target="_top">getaddrinfo</a><span class="special">(</span><span class="identifier">H</span><span class="special">,</span> <span class="identifier">S</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">hints</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">result</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, a non-empty results object
              containing the results of the resolve operation. Otherwise <code class="computeroutput"><span class="identifier">results_type</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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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_resolve</span><span class="special">(</span><span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">resolver_base</span><span class="special">::</span><span class="identifier">flags</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">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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>
              <span class="identifier">results_type</span> <span class="identifier">r</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">host_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>, let <code class="literal">H</code> be
              an NTBS constructed from <code class="computeroutput"><span class="identifier">host_name</span></code>;
              otherwise, let <code class="literal">H</code> be <code class="computeroutput"><span class="keyword">nullptr</span></code>.
              If <code class="computeroutput"><span class="identifier">service_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
              <span class="special">!=</span> <span class="keyword">nullptr</span></code>,
              let <code class="literal">S</code> be an NTBS constructed from <code class="computeroutput"><span class="identifier">service_name</span></code>; otherwise, let <code class="literal">S</code>
              be <code class="computeroutput"><span class="keyword">nullptr</span></code>. Initiates
              an asynchronous operation to resolve a host name and service name,
              as if by POSIX:
</p><pre class="programlisting"><span class="identifier">addrinfo</span> <span class="identifier">hints</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_flags</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">f</span><span class="special">);</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_family</span> <span class="special">=</span> <span class="identifier">AF_UNSPEC</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_socktype</span> <span class="special">=</span> <span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">type</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_protocol</span> <span class="special">=</span> <span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addr</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addrlen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_canonname</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_next</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">addrinfo</span><span class="special">*</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html" target="_top">getaddrinfo</a><span class="special">(</span><span class="identifier">H</span><span class="special">,</span> <span class="identifier">S</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">hints</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">result</span><span class="special">);</span>
</pre><p>
              On success, <code class="computeroutput"><span class="identifier">r</span></code> is a
              non-empty results object containing the results of the resolve opeation.
              Otherwise, <code class="computeroutput"><span class="identifier">r</span></code> is <code class="computeroutput"><span class="identifier">results_type</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</span><span class="special">);</span>
<span class="identifier">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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">resolve</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">resolver_base</span><span class="special">::</span><span class="identifier">flags</span><span class="special">(),</span> <span class="identifier">ec</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">results_type</span> <span class="identifier">resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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">host_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>, let <code class="literal">H</code> be
              an NTBS constructed from <code class="computeroutput"><span class="identifier">host_name</span></code>;
              otherwise, let <code class="literal">H</code> be <code class="computeroutput"><span class="keyword">nullptr</span></code>.
              If <code class="computeroutput"><span class="identifier">service_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
              <span class="special">!=</span> <span class="keyword">nullptr</span></code>,
              let <code class="literal">S</code> be an NTBS constructed from <code class="computeroutput"><span class="identifier">service_name</span></code>; otherwise, let <code class="literal">S</code>
              be <code class="computeroutput"><span class="keyword">nullptr</span></code>. Resolves a
              host name and service name, as if by POSIX:
</p><pre class="programlisting"><span class="identifier">addrinfo</span> <span class="identifier">hints</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_flags</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">f</span><span class="special">);</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_family</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_socktype</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_protocol</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addr</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addrlen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_canonname</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_next</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">addrinfo</span><span class="special">*</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html" target="_top">getaddrinfo</a><span class="special">(</span><span class="identifier">H</span><span class="special">,</span> <span class="identifier">S</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">hints</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">result</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> On success, a non-empty results object
              containing the results of the resolve operation. Otherwise <code class="computeroutput"><span class="identifier">results_type</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="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</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">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</span> <span class="identifier">service_name</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_resolve</span><span class="special">(</span><span class="identifier">protocol</span><span class="special">,</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">resolver_base</span><span class="special">::</span><span class="identifier">flags</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">CompletionToken</span><span class="special">&gt;</span>
  <span class="emphasis"><em>DEDUCED</em></span> <span class="identifier">async_resolve</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">protocol</span><span class="special">&amp;</span> <span class="identifier">protocol</span><span class="special">,</span>
                        <span class="identifier">string_view</span> <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">string_view</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">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>
              <span class="identifier">results_type</span> <span class="identifier">r</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">host_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span></code>, let <code class="literal">H</code> be
              an NTBS constructed from <code class="computeroutput"><span class="identifier">host_name</span></code>;
              otherwise, let <code class="literal">H</code> be <code class="computeroutput"><span class="keyword">nullptr</span></code>.
              If <code class="computeroutput"><span class="identifier">service_name</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span>
              <span class="special">!=</span> <span class="keyword">nullptr</span></code>,
              let <code class="literal">S</code> be an NTBS constructed from <code class="computeroutput"><span class="identifier">service_name</span></code>; otherwise, let <code class="literal">S</code>
              be <code class="computeroutput"><span class="keyword">nullptr</span></code>. Initiates
              an asynchronous operation to resolve a host name and service name,
              as if by POSIX:
</p><pre class="programlisting"><span class="identifier">addrinfo</span> <span class="identifier">hints</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_flags</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">f</span><span class="special">);</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_family</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">family</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_socktype</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">type</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_protocol</span> <span class="special">=</span> <span class="identifier">protocol</span><span class="special">.</span><span class="identifier">protocol</span><span class="special">();</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addr</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_addrlen</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_canonname</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">hints</span><span class="special">.</span><span class="identifier">ai_next</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<span class="identifier">addrinfo</span><span class="special">*</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html" target="_top">getaddrinfo</a><span class="special">(</span><span class="identifier">H</span><span class="special">,</span> <span class="identifier">S</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">hints</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">result</span><span class="special">);</span>
</pre><p>
              On success, <code class="computeroutput"><span class="identifier">r</span></code> is a
              non-empty results object containing the results of the resolve opeation.
              Otherwise, <code class="computeroutput"><span class="identifier">r</span></code> is <code class="computeroutput"><span class="identifier">results_type</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">results_type</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">results_type</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> Let <code class="computeroutput"><span class="identifier">S1</span></code>
              and <code class="computeroutput"><span class="identifier">S2</span></code> be implementation-defined
              values that are sufficiently large to hold the host name and service
              name respectively. Resolves an endpoint as if by POSIX:
</p><pre class="programlisting"><span class="keyword">char</span> <span class="identifier">host_name</span><span class="special">[</span><span class="identifier">S1</span><span class="special">];</span>
<span class="keyword">char</span> <span class="identifier">service_name</span><span class="special">[</span><span class="identifier">S2</span><span class="special">];</span>
<span class="keyword">int</span> <span class="identifier">flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">type</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">SOCK_DGRAM</span><span class="special">)</span>
  <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">NI_DGRAM</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html" target="_top">getnameinfo</a><span class="special">(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span>
                             <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">S1</span><span class="special">,</span>
                             <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">S2</span><span class="special">,</span>
                             <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">!=</span> <span class="number">0</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">NI_NUMERICSERV</span><span class="special">;</span>
  <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html" target="_top">getnameinfo</a><span class="special">(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span>
                           <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">S1</span><span class="special">,</span>
                           <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">S2</span><span class="special">,</span>
                           <span class="identifier">flags</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> On success, a results object with <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">1</span></code>
              containing the results of the resolve operation. Otherwise <code class="computeroutput"><span class="identifier">results_type</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="emphasis"><em>DEDUCED</em></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>
              <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">results_type</span> <span class="identifier">r</span><span class="special">)</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Let <code class="computeroutput"><span class="identifier">S1</span></code>
              and <code class="computeroutput"><span class="identifier">S2</span></code> be implementation-defined
              values that are sufficiently large to hold the host name and service
              name respectively. Initiates an asynchronous operation to resolve an
              endpoint as if by POSIX:
</p><pre class="programlisting"><span class="keyword">char</span> <span class="identifier">host_name</span><span class="special">[</span><span class="identifier">S1</span><span class="special">];</span>
<span class="keyword">char</span> <span class="identifier">service_name</span><span class="special">[</span><span class="identifier">S2</span><span class="special">];</span>
<span class="keyword">int</span> <span class="identifier">flags</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">endpoint_type</span><span class="special">().</span><span class="identifier">protocol</span><span class="special">().</span><span class="identifier">type</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">SOCK_DGRAM</span><span class="special">)</span>
  <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">NI_DGRAM</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html" target="_top">getnameinfo</a><span class="special">(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span>
                             <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">S1</span><span class="special">,</span>
                             <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">S2</span><span class="special">,</span>
                             <span class="identifier">flags</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">!=</span> <span class="number">0</span><span class="special">)</span>
<span class="special">{</span>
  <span class="identifier">flags</span> <span class="special">|=</span> <span class="identifier">NI_NUMERICSERV</span><span class="special">;</span>
  <span class="identifier">result</span> <span class="special">=</span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html" target="_top">getnameinfo</a><span class="special">(</span><span class="identifier">e</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span>
                           <span class="identifier">host_name</span><span class="special">,</span> <span class="identifier">S1</span><span class="special">,</span>
                           <span class="identifier">service_name</span><span class="special">,</span> <span class="identifier">S2</span><span class="special">,</span>
                           <span class="identifier">flags</span><span class="special">);</span>
<span class="special">}</span>
</pre><p>
              On success, <code class="computeroutput"><span class="identifier">r</span></code> is a
              results object with <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span></code> containing the results of the resolve
              operation; otherwise, <code class="computeroutput"><span class="identifier">r</span></code>
              is <code class="computeroutput"><span class="identifier">results_type</span><span class="special">()</span></code>.
            </p></blockquote></div></div></div><div class="section" title="10.20.19.&#160;Host name functions"><div class="titlepage"><div><div><h4 class="title"><a name="functions.ip__host_name"></a>10.20.19.&#160;Host name functions</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.host.name"></a>
<a class="link" href="#internet.host.name">[internet.host.name]</a>
<a class="indexterm" name="idm168514159136"></a>
</span>
        </p><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> <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">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">host_name</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">const</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
  <span class="identifier">basic_string</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">char_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
    <span class="identifier">host_name</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="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> The standard host name for the current
            machine, determined as if by POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/gethostname.html" target="_top">gethostname</a>.
          </p></blockquote></div></div><div class="section" title="10.20.20.&#160;Class ip::tcp"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__tcp"></a>10.20.20.&#160;Class <code class="literal">ip::tcp</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.tcp"></a>
<a class="link" href="#internet.tcp">[internet.tcp]</a>
<a class="indexterm" name="idm168514116976"></a>
</span>
        </p><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="10.20.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="10.20.21.&#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="keyword">constexpr</span> <span class="identifier">tcp</span> <span class="identifier">v4</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">tcp</span> <span class="identifier">v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="identifier">tcp</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// tcp comparisons:</span>
        <span class="keyword">constexpr</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">noexcept</span><span class="special">;</span>
        <span class="keyword">constexpr</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">noexcept</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 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">constexpr</span> <span class="keyword">int</span> <span class="identifier">family</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">int</span> <span class="identifier">type</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">int</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="emphasis"><em>// remainder unchanged</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>
          The return values for these member functions are listed in the table below.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__tcp.t0"></a><p class="title"><b>Table&#160;35.&#160;Behavior of extensible implementations</b></p><div class="table-contents"><table class="table" summary="Behavior of extensible implementations"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    value
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">family</span><span class="special">()</span></code>
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">type</span><span class="special">()</span></code>
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">protocol</span><span class="special">()</span></code>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">tcp</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">AF_INET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</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">tcp</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">AF_INET6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</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_STREAM</span></code> are defined in the POSIX
          header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX header
          file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="10.20.20.1.&#160;ip::tcp comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__tcp__comparisons"></a>10.20.20.1.&#160;<code class="literal">ip::tcp</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.tcp.comparisons"></a>
<a class="link" href="#internet.tcp.comparisons">[internet.tcp.comparisons]</a>
<a class="indexterm" name="idm168513971232"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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">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 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 <code class="computeroutput"><span class="keyword">true</span></code>, 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 <code class="computeroutput"><span class="keyword">true</span></code>,
              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 <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="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">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 class="section" title="10.20.21.&#160;Class ip::tcp::no_delay"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__tcp__no_delay"></a>10.20.21.&#160;Class <code class="literal">ip::tcp::no_delay</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.tcp.nodelay"></a>
<a class="link" href="#internet.tcp.nodelay">[internet.tcp.nodelay]</a>
<a class="indexterm" name="idm168511806688"></a>
</span>
        </p><p>
          The <code class="computeroutput"><span class="identifier">no_delay</span></code> class represents
          a socket option that determines whether a TCP socket will avoid coalescing
          of small segments. [<span class="emphasis"><em>Note:</em></span> That is, setting this option
          disables the Nagle algorithm. &#8212;<span class="emphasis"><em>end note</em></span>] It is defined
          as a <a class="link" href="#classes.socket_base__bool_socket_options" title="10.17.5.&#160;Boolean socket options">boolean socket
          option</a>.
        </p><p>
          Let <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__tcp__no_delay.t0"></a><p class="title"><b>Table&#160;36.&#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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="10.20.22.&#160;Class ip::udp"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__udp"></a>10.20.22.&#160;Class <code class="literal">ip::udp</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.udp"></a>
<a class="link" href="#internet.udp">[internet.udp]</a>
<a class="indexterm" name="idm168511769680"></a>
</span>
        </p><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="10.20.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="keyword">constexpr</span> <span class="identifier">udp</span> <span class="identifier">v4</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">udp</span> <span class="identifier">v6</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>

          <span class="identifier">udp</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
        <span class="special">};</span>

        <span class="comment">// udp comparisons:</span>
        <span class="keyword">constexpr</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">noexcept</span><span class="special">;</span>
        <span class="keyword">constexpr</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">noexcept</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 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">constexpr</span> <span class="keyword">int</span> <span class="identifier">family</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="identifier">constpexr</span> <span class="keyword">int</span> <span class="identifier">type</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">int</span> <span class="identifier">protocol</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
          <span class="emphasis"><em>// remainder unchanged</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>
          The return values for these member functions are listed in the table below.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__udp.t0"></a><p class="title"><b>Table&#160;37.&#160;Behavior of extensible implementations</b></p><div class="table-contents"><table class="table" summary="Behavior of extensible implementations"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    value
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">family</span><span class="special">()</span></code>
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">type</span><span class="special">()</span></code>
                  </p>
                </th><th>
                  <p>
                    <code class="computeroutput"><span class="identifier">protocol</span><span class="special">()</span></code>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">udp</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">AF_INET</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</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="special">::</span><span class="identifier">v6</span><span class="special">()</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">AF_INET6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">SOCK_DGRAM</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 POSIX header
          file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX header
          file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="10.20.22.1.&#160;ip::udp comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__udp__comparisons"></a>10.20.22.1.&#160;<code class="literal">ip::udp</code> comparisons</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.udp.comparisons"></a>
<a class="link" href="#internet.udp.comparisons">[internet.udp.comparisons]</a>
<a class="indexterm" name="idm168511633984"></a>
</span>
          </p><pre class="programlisting"><span class="keyword">constexpr</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">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 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 <code class="computeroutput"><span class="keyword">true</span></code>, 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 <code class="computeroutput"><span class="keyword">true</span></code>,
              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 <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="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">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 class="section" title="10.20.23.&#160;Class ip::v6_only"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__v6_only"></a>10.20.23.&#160;Class <code class="literal">ip::v6_only</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.v6only"></a>
<a class="link" href="#internet.v6only">[internet.v6only]</a>
<a class="indexterm" name="idm168511582912"></a>
</span>
        </p><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="10.17.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;38.&#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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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="10.20.24.&#160;Class ip::unicast::hops"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__unicast__hops"></a>10.20.24.&#160;Class <code class="literal">ip::unicast::hops</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.unicast.hops"></a>
<a class="link" href="#internet.unicast.hops">[internet.unicast.hops]</a>
<a class="indexterm" name="idm168511555536"></a>
</span>
        </p><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 is an <a class="link" href="#classes.socket_base__int_socket_options" title="10.17.6.&#160;Integral socket options">integral
          socket option</a>.
        </p><p>
          <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
          In the table below, <code class="computeroutput"><span class="identifier">p</span></code> denotes
          a (possibly const) value of a type meeting the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
          requirements, as passed to the socket option's <code class="computeroutput"><span class="identifier">level</span></code>
          and <code class="computeroutput"><span class="identifier">name</span></code> member functions.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__unicast__hops.t0"></a><p class="title"><b>Table&#160;39.&#160;hops integral socket option</b></p><div class="table-contents"><table class="table" summary="hops integral socket option"><colgroup><col><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> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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>
                  </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_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_TTL</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_UNICAST_HOPS</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
          POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX?
        </p></div><p>
          The constructor and assignment operator for the <code class="computeroutput"><span class="identifier">hops</span></code>
          class that accept an <code class="computeroutput"><span class="keyword">int</span></code> 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="10.20.25.&#160;Multicast group management socket options"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__group_socket_options"></a>10.20.25.&#160;Multicast group management socket options</h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.multicast.group"></a>
<a class="link" href="#internet.multicast.group">[internet.multicast.group]</a>
<a class="indexterm" name="idm168513339536"></a>
</span>
        </p><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">Destructible</span></code> (C++ Std,
          [destructible]), <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
          (C++ Std, [copyconstructible]), <code class="computeroutput"><span class="identifier">Assignable</span></code>
          (C++ Std, [assignable]), and <a class="link" href="#requirements.settable_socket_option" title="10.17.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">make_address</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="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">noexcept</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">noexcept</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="keyword">noexcept</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="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">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="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">Protocol</span><span class="special">&gt;</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="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="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">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="keyword">noexcept</span><span class="special">;</span>
  <span class="comment">// <span class="emphasis"><em>remainder unchanged</em></span></span>
<span class="keyword">private</span><span class="special">:</span>
  <span class="identifier">ip_mreq</span> <span class="identifier">v4_value_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
  <span class="identifier">ipv6_mreq</span> <span class="identifier">v6_value_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
<span class="special">};</span>
</pre><p>
          Let <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
          In the table below, <code class="computeroutput"><span class="identifier">p</span></code> denotes
          a (possibly const) value of a type meeting the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
          requirements, as passed to the socket option's <code class="computeroutput"><span class="identifier">level</span></code>
          and <code class="computeroutput"><span class="identifier">name</span></code> member functions.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__group_socket_options.t0"></a><p class="title"><b>Table&#160;40.&#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><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>C</em></span>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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>
                  </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_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_ADD_MEMBERSHIP</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_JOIN_GROUP</span></code>
                  </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_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_DROP_MEMBERSHIP</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_LEAVE_GROUP</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>
          and <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code> are defined
          in the POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX?
        </p></div><div class="section" title="10.20.25.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>10.20.25.1.&#160;Multicast group management socket option constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.multicast.group.cons"></a>
<a class="link" href="#internet.multicast.group.cons">[internet.multicast.group.cons]</a>
<a class="indexterm" name="idm168513138816"></a>
</span>
          </p><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> <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">multicast_group</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>,
              calls <code class="literal"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span></code><code class="computeroutput"><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">multicast_group</span><span class="special">))</span></code>; otherwise, calls <code class="literal"><span class="emphasis"><em><span class="bold"><strong>C</strong></span></em></span></code><code class="computeroutput"><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">multicast_group</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">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">noexcept</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> <span class="keyword">noexcept</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="10.20.25.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>10.20.25.2.&#160;Multicast group management socket option members (extensible implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.multicast.group.extensible"></a>
<a class="link" href="#internet.multicast.group.extensible">[internet.multicast.group.extensible]</a>
<a class="indexterm" name="idm168513072656"></a>
</span>
          </p><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="keyword">noexcept</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="keyword">noexcept</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="keyword">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">v4_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="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="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">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="10.20.26.&#160;Class ip::multicast::outbound_interface"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__outbound_interface"></a>10.20.26.&#160;Class <code class="literal">ip::multicast::outbound_interface</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.multicast.outbound"></a>
<a class="link" href="#internet.multicast.outbound">[internet.multicast.outbound]</a>
<a class="indexterm" name="idm168512999232"></a>
</span>
        </p><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">Destructible</span></code>
          (C++ Std, [destructible]), <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>
          (C++ Std, [copyconstructible]), <code class="computeroutput"><span class="identifier">Assignable</span></code>
          (C++ Std, [assignable]), and <a class="link" href="#requirements.settable_socket_option" title="10.17.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="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">noexcept</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="keyword">noexcept</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="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">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="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">Protocol</span><span class="special">&gt;</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="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="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">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="keyword">noexcept</span><span class="special">;</span>
            <span class="comment">// <span class="emphasis"><em>remainder unchanged</em></span></span>
          <span class="keyword">private</span><span class="special">:</span>
              <span class="identifier">in_addr</span> <span class="identifier">v4_value_</span><span class="special">;</span> <span class="comment">// <span class="emphasis"><em>exposition only</em></span></span>
              <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">v6_value_</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 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 POSIX 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><p>
          Let <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
          In the table below, <code class="computeroutput"><span class="identifier">p</span></code> denotes
          a (possibly const) value of a type meeting the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
          requirements, as passed to the socket option's <code class="computeroutput"><span class="identifier">level</span></code>
          and <code class="computeroutput"><span class="identifier">name</span></code> member functions.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__outbound_interface.t0"></a><p class="title"><b>Table&#160;41.&#160;outbound_interface socket option</b></p><div class="table-contents"><table class="table" summary="outbound_interface socket option"><colgroup><col><col><col><col></colgroup><thead><tr><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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>
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IPPROTO_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_MULTICAST_TTL</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_MULTICAST_HOPS</span></code>
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><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>,
            <code class="computeroutput"><span class="identifier">IPPROTO_IPV6</span></code>, and <code class="computeroutput"><span class="identifier">IPV6_MULTICAST_IF</span></code> are defined in the
            POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX?
        </p></div><div class="section" title="10.20.26.1.&#160;ip::multicast::outbound_interface constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__multicast__outbound_interface__constructors"></a>10.20.26.1.&#160;<code class="literal">ip::multicast::outbound_interface</code> constructors</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.multicast.outbound.cons"></a>
<a class="link" href="#internet.multicast.outbound.cons">[internet.multicast.outbound.cons]</a>
<a class="indexterm" name="idm168510726224"></a>
</span>
          </p><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> <span class="keyword">noexcept</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> <span class="keyword">noexcept</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="10.20.26.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>10.20.26.2.&#160;<code class="literal">ip::multicast::outbound_interface</code> members (extensible
          implementations)</h5></div></div></div><p>
            <span class="xrefid">
<a name="internet.multicast.outbound.extensible"></a>
<a class="link" href="#internet.multicast.outbound.extensible">[internet.multicast.outbound.extensible]</a>
<a class="indexterm" name="idm168510699472"></a>
</span>
          </p><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="keyword">noexcept</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="keyword">noexcept</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="keyword">void</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="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">std</span><span class="special">::</span><span class="identifier">addressof</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="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">v4_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="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="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">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="10.20.27.&#160;Class ip::multicast::hops"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__hops"></a>10.20.27.&#160;Class <code class="literal">ip::multicast::hops</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.multicast.hops"></a>
<a class="link" href="#internet.multicast.hops">[internet.multicast.hops]</a>
<a class="indexterm" name="idm168510626128"></a>
</span>
        </p><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 is defined as
          an <a class="link" href="#classes.socket_base__int_socket_options" title="10.17.6.&#160;Integral socket options">integral socket
          option</a>.
        </p><p>
          <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
          In the table below, <code class="computeroutput"><span class="identifier">p</span></code> denotes
          a (possibly const) value of a type meeting the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
          requirements, as passed to the socket option's <code class="computeroutput"><span class="identifier">level</span></code>
          and <code class="computeroutput"><span class="identifier">name</span></code> member functions.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__hops.t0"></a><p class="title"><b>Table&#160;42.&#160;hops integral socket option</b></p><div class="table-contents"><table class="table" summary="hops integral socket option"><colgroup><col><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> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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>
                  </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_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_MULTICAST_TTL</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_MULTICAST_HOPS</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
          POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX?
        </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="10.20.28.&#160;Class ip::multicast::enable_loopback"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__multicast__enable_loopback"></a>10.20.28.&#160;Class <code class="literal">ip::multicast::enable_loopback</code></h4></div></div></div><p>
          <span class="xrefid">
<a name="internet.multicast.enable.loopback"></a>
<a class="link" href="#internet.multicast.enable.loopback">[internet.multicast.enable.loopback]</a>
<a class="indexterm" name="idm168510557216"></a>
</span>
        </p><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 is defined as a <a class="link" href="#classes.socket_base__bool_socket_options" title="10.17.5.&#160;Boolean socket options">boolean
          socket option</a>.
        </p><p>
          <code class="literal"><span class="emphasis"><em>L</em></span></code> and <code class="literal"><span class="emphasis"><em>N</em></span></code>
          identify POSIX macros to be passed as the <span class="emphasis"><em>level</em></span> and
          <span class="emphasis"><em>option_name</em></span> arguments, respectively, to POSIX <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top">setsockopt</a>
          and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top">getsockopt</a>.
          In the table below, <code class="computeroutput"><span class="identifier">p</span></code> denotes
          a (possibly const) value of a type meeting the <a class="link" href="#requirements.protocol" title="10.17.2.3.&#160;Protocol requirements">protocol</a>
          requirements, as passed to the socket option's <code class="computeroutput"><span class="identifier">level</span></code>
          and <code class="computeroutput"><span class="identifier">name</span></code> member functions.
        </p><div class="table"><a name="classes.proposed_text.internet_protocol.ip__multicast__enable_loopback.t0"></a><p class="title"><b>Table&#160;43.&#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><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> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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_INET4</span></code>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>L</em></span> 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>
                  </p>
                </th><th>
                  <p>
                    <span class="emphasis"><em>N</em></span> 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>
                  </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_IP</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">IP_MULTICAST_LOOP</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_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
          POSIX header file <a href="http://www.opengroup.org/onlinepubs/9699919799/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 POSIX?
        </p></div></div></div><div class="section" title="10.21.&#160;Index"><div class="titlepage"><div><div><h3 class="title"><a name="network.index"></a>10.21.&#160;Index</h3></div></div></div><p>
        </p><div class="index" title="Cross references"><div class="titlepage"><div><div><h4 class="title"><a name="idm168510496800"></a>Cross references</h4></div></div></div><div class="index"><div class="indexdiv"><h3>A</h3><dl><dt>async, <a class="indexterm" href="#network.async">Asynchronous model</a></dt><dt>async.assoc.alloc, <a class="indexterm" href="#classes.associated_allocator">Class template associated_allocator</a></dt><dt>async.assoc.alloc.get, <a class="indexterm" href="#functions.get_associated_allocator">Function get_associated_allocator</a></dt><dt>async.assoc.alloc.members, <a class="indexterm" href="#classes.__associated_allocator__members">associated_allocator members</a></dt><dt>async.assoc.exec, <a class="indexterm" href="#classes.associated_executor">Class template associated_executor</a></dt><dt>async.assoc.exec.get, <a class="indexterm" href="#functions.get_associated_executor">Function get_associated_executor</a></dt><dt>async.assoc.exec.members, <a class="indexterm" href="#classes.__associated_executor__members">associated_executor members</a></dt><dt>async.async.completion, <a class="indexterm" href="#classes.async_completion">Class template async_completion</a></dt><dt>async.async.completion.members, <a class="indexterm" href="#classes.__async_completion__members">async_completion members</a></dt><dt>async.async.result, <a class="indexterm" href="#classes.async_result">Class template async_result</a></dt><dt>async.bad.exec, <a class="indexterm" href="#classes.bad_executor">Class bad_executor</a></dt><dt>async.defer, <a class="indexterm" href="#functions.defer">Function defer</a></dt><dt>async.dispatch, <a class="indexterm" href="#functions.dispatch">Function dispatch</a></dt><dt>async.exec.ctx, <a class="indexterm" href="#classes.execution_context">Class execution_context</a></dt><dt>async.exec.ctx.cons, <a class="indexterm" href="#classes.__execution_context__constructor">execution_context constructor</a></dt><dt>async.exec.ctx.dtor, <a class="indexterm" href="#classes.__execution_context__destructor">execution_context destructor</a></dt><dt>async.exec.ctx.globals, <a class="indexterm" href="#classes.__execution_context__globals">execution_context globals</a></dt><dt>async.exec.ctx.ops, <a class="indexterm" href="#classes.__execution_context__operations">execution_context operations</a></dt><dt>async.exec.ctx.protected, <a class="indexterm" href="#classes.__execution_context__protected_operations">execution_context protected operations</a></dt><dt>async.exec.ctx.svc, <a class="indexterm" href="#classes.execution_context__service">Class execution_context::service</a></dt><dt>async.exec.ctx.svc.members, <a class="indexterm" href="#classes.__execution_context__service__members">execution_context::service members</a></dt><dt>async.exec.work, <a class="indexterm" href="#classes.executor_work">Class template executor_work</a></dt><dt>async.exec.work.members, <a class="indexterm" href="#classes.__executor_work__members">executor_work members</a></dt><dt>async.exec.wrapper, <a class="indexterm" href="#classes.executor_wrapper">Class template executor_wrapper</a></dt><dt>async.exec.wrapper.access, <a class="indexterm" href="#classes.__executor_wrapper__access">executor_wrapper access</a></dt><dt>async.exec.wrapper.assoc.alloc, <a class="indexterm" href="#classes.class_template_partial_specialization___associated_allocator_">Class template partial specialization associated_allocator</a></dt><dt>async.exec.wrapper.assoc.exec, <a class="indexterm" href="#classes.class_template_partial_specialization___associated_executor_">Class template partial specialization associated_executor</a></dt><dt>async.exec.wrapper.async.result, <a class="indexterm" href="#classes.class_template_partial_specialization___async_result_">Class template partial specialization async_result</a></dt><dt>async.exec.wrapper.cons, <a class="indexterm" href="#classes.__executor_wrapper__constructors">executor_wrapper constructors</a></dt><dt>async.exec.wrapper.invocation, <a class="indexterm" href="#classes.__executor_wrapper__invocation">executor_wrapper invocation</a></dt><dt>async.executor, <a class="indexterm" href="#classes.executor">Class executor</a></dt><dt>async.executor.algo, <a class="indexterm" href="#classes.__executor__specialized_algorithms">executor specialized algorithms</a></dt><dt>async.executor.arg, <a class="indexterm" href="#classes.executor_arg_t">Executor argument tag</a></dt><dt>async.executor.assign, <a class="indexterm" href="#classes.__executor__assignment">executor assignment</a></dt><dt>async.executor.capacity, <a class="indexterm" href="#classes.__executor__capacity">executor capacity</a></dt><dt>async.executor.comparisons, <a class="indexterm" href="#classes.__executor__comparisons">executor comparisons</a></dt><dt>async.executor.cons, <a class="indexterm" href="#classes.__executor__constructors">executor constructors</a></dt><dt>async.executor.dtor, <a class="indexterm" href="#classes.__executor__destructor">executor destructor</a></dt><dt>async.executor.modifiers, <a class="indexterm" href="#classes.__executor__modifiers">executor modifiers</a></dt><dt>async.executor.ops, <a class="indexterm" href="#classes.__executor__operations">executor operations</a></dt><dt>async.executor.target, <a class="indexterm" href="#classes.__executor__target_access">executor target access</a></dt><dt>async.handler.type, <a class="indexterm" href="#classes.completion_handler_type">Class template completion_handler_type</a></dt><dt>async.is.exec, <a class="indexterm" href="#classes.is_executor">Class template is_executor</a></dt><dt>async.make.work, <a class="indexterm" href="#functions.make_work">Function make_work</a></dt><dt>async.package, <a class="indexterm" href="#functions.package">Function package</a></dt><dt>async.package.handler, <a class="indexterm" href="#classes.packaged_handler">Class template packaged_handler</a></dt><dt>async.package.handler.async.result, <a class="indexterm" href="#classes.async_result_packaged_handler">Partial class template specialization async_result</a></dt><dt>async.package.handler.members, <a class="indexterm" href="#classes.__packaged_handler__members">packaged_handler members</a></dt><dt>async.package.token, <a class="indexterm" href="#classes.packaged_token">Class template packaged_token</a></dt><dt>async.package.token.members, <a class="indexterm" href="#classes.__packaged_token__members">packaged_token members</a></dt><dt>async.packaged.task.specializations, <a class="indexterm" href="#classes.async_result_packaged_task">Partial class template specialization async_result
        for packaged_task</a></dt><dt>async.post, <a class="indexterm" href="#functions.post">Function post</a></dt><dt>async.reqmts, <a class="indexterm" href="#network.async_requirements">Requirements</a></dt><dt>async.reqmts.async, <a class="indexterm" href="#requirements.asynchronous_operations">Requirements on asynchronous operations</a></dt><dt>async.reqmts.async.alloc, <a class="indexterm" href="#requirements.allocation_of_intermediate_storage">Allocation of intermediate storage</a></dt><dt>async.reqmts.async.assoc.exec, <a class="indexterm" href="#requirements.associated_executor">Associated executor</a></dt><dt>async.reqmts.async.completion, <a class="indexterm" href="#requirements.execution_of_completion_handler_on_completion_of_asynchronous_operation">Execution of completion handler on completion of asynchronous
            operation</a></dt><dt>async.reqmts.async.exceptions, <a class="indexterm" href="#requirements.completion_handlers_and_exceptions">Completion handlers and exceptions</a></dt><dt>async.reqmts.async.handler.exec, <a class="indexterm" href="#requirements.completion_handler_executor">Completion handler executor</a></dt><dt>async.reqmts.async.io.exec, <a class="indexterm" href="#requirements.i_o_executor">I/O executor</a></dt><dt>async.reqmts.async.lifetime, <a class="indexterm" href="#requirements.lifetime_of_initiating_function_arguments">Lifetime of initiating function arguments</a></dt><dt>async.reqmts.async.return.type, <a class="indexterm" href="#requirements.automatic_deduction_of_initiating_function_return_type">Automatic deduction of initiating function return type</a></dt><dt>async.reqmts.async.return.value, <a class="indexterm" href="#requirements.production_of_initiating_function_return_value">Production of initiating function return value</a></dt><dt>async.reqmts.async.token, <a class="indexterm" href="#requirements.completion_token">Completion tokens and handlers</a></dt><dt>async.reqmts.async.work, <a class="indexterm" href="#requirements.outstanding_work">Outstanding work</a></dt><dt>async.reqmts.executioncontext, <a class="indexterm" href="#requirements.execution_context">Execution context requirements</a></dt><dt>async.reqmts.executor, <a class="indexterm" href="#requirements.executor">Executor requirements</a></dt><dt>async.reqmts.proto.allocator, <a class="indexterm" href="#requirements.proto_allocator">Proto-allocator requirements</a></dt><dt>async.reqmts.service, <a class="indexterm" href="#requirements.service">Service requirements</a></dt><dt>async.reqmts.signature, <a class="indexterm" href="#requirements.signature">Signature requirements</a></dt><dt>async.strand, <a class="indexterm" href="#classes.strand">Class template strand</a></dt><dt>async.strand.assign, <a class="indexterm" href="#classes.__strand__assignment">strand assignment</a></dt><dt>async.strand.comparisons, <a class="indexterm" href="#classes.__strand__comparisons">strand comparisons</a></dt><dt>async.strand.cons, <a class="indexterm" href="#classes.__strand__constructors">strand constructors</a></dt><dt>async.strand.dtor, <a class="indexterm" href="#classes.__strand__destructor">strand destructor</a></dt><dt>async.strand.ops, <a class="indexterm" href="#classes.__strand__operations">strand operations</a></dt><dt>async.synop, <a class="indexterm" href="#headers.header____experimental_executor___synopsis">Header &lt;experimental/executor&gt; synopsis</a></dt><dt>async.system.exec, <a class="indexterm" href="#classes.system_executor">Class system_executor</a></dt><dt>async.system.exec.comparisons, <a class="indexterm" href="#classes.__system_executor__comparisons">system_executor comparisons</a></dt><dt>async.system.exec.ops, <a class="indexterm" href="#classes.__system_executor__operations">system_executor operations</a></dt><dt>async.use.future, <a class="indexterm" href="#classes.use_future_t">Class template use_future_t</a></dt><dt>async.use.future.cons, <a class="indexterm" href="#classes.__use_future_t__constructors">use_future_t constructors</a></dt><dt>async.use.future.members, <a class="indexterm" href="#classes.__use_future_t__members">use_future_t members</a></dt><dt>async.use.future.traits, <a class="indexterm" href="#classes.use_future_t_traits">use_future_t traits</a></dt><dt>async.uses.executor, <a class="indexterm" href="#classes.uses_executor">uses_executor</a></dt><dt>async.uses.executor.cons, <a class="indexterm" href="#classes.uses_executor_construction">uses-executor construction</a></dt><dt>async.uses.executor.trait, <a class="indexterm" href="#classes.__uses_executor__trait">uses_executor trait</a></dt><dt>async.wrap, <a class="indexterm" href="#functions.wrap">Function wrap</a></dt></dl></div><div class="indexdiv"><h3>B</h3><dl><dt>buffer, <a class="indexterm" href="#network.buffers">Buffers</a></dt><dt>buffer.arithmetic, <a class="indexterm" href="#functions.buffer_arithmetic">Buffer arithmetic</a></dt><dt>buffer.async.read, <a class="indexterm" href="#functions.async_read">Asynchronous read operations</a></dt><dt>buffer.async.read.until, <a class="indexterm" href="#functions.async_read_until">Asynchronous delimited read operations</a></dt><dt>buffer.async.write, <a class="indexterm" href="#functions.async_write">Asynchronous write operations</a></dt><dt>buffer.cast, <a class="indexterm" href="#functions.buffer_cast">Function buffer_cast</a></dt><dt>buffer.const, <a class="indexterm" href="#classes.const_buffer">Class const_buffer</a></dt><dt>buffer.const.1, <a class="indexterm" href="#classes.const_buffers_1">Class const_buffers_1</a></dt><dt>buffer.const.1.cons, <a class="indexterm" href="#classes.__const_buffers_1__constructors">const_buffers_1 constructors</a></dt><dt>buffer.const.1.members, <a class="indexterm" href="#classes.__const_buffers_1__members">const_buffers_1 members</a></dt><dt>buffer.const.cons, <a class="indexterm" href="#classes.__const_buffer__constructors">const_buffer constructors</a></dt><dt>buffer.copy, <a class="indexterm" href="#functions.buffer_copy">Function buffer_copy</a></dt><dt>buffer.creation, <a class="indexterm" href="#functions.buffer">Buffer creation functions</a></dt><dt>buffer.dynamic.creation, <a class="indexterm" href="#functions.dynamic_buffer">Dynamic buffer creation functions</a></dt><dt>buffer.dynamic.string, <a class="indexterm" href="#classes.dynamic_string_buffer">Class template dynamic_string_buffer</a></dt><dt>buffer.dynamic.string.cons, <a class="indexterm" href="#classes.__dynamic_string_buffer__constructors">dynamic_string_buffer constructors</a></dt><dt>buffer.dynamic.string.members, <a class="indexterm" href="#classes.__dynamic_string_buffer__members">dynamic_string_buffer members</a></dt><dt>buffer.dynamic.vector, <a class="indexterm" href="#classes.dynamic_vector_buffer">Class template dynamic_vector_buffer</a></dt><dt>buffer.dynamic.vector.cons, <a class="indexterm" href="#classes.__dynamic_vector_buffer__constructors">dynamic_vector_buffer constructors</a></dt><dt>buffer.dynamic.vector.members, <a class="indexterm" href="#classes.__dynamic_vector_buffer__members">dynamic_vector_buffer members</a></dt><dt>buffer.mutable, <a class="indexterm" href="#classes.mutable_buffer">Class mutable_buffer</a></dt><dt>buffer.mutable.1, <a class="indexterm" href="#classes.mutable_buffers_1">Class mutable_buffers_1</a></dt><dt>buffer.mutable.1.cons, <a class="indexterm" href="#classes.__mutable_buffers_1__constructors">mutable_buffers_1 constructors</a></dt><dt>buffer.mutable.1.members, <a class="indexterm" href="#classes.__mutable_buffers_1__members">mutable_buffers_1 members</a></dt><dt>buffer.mutable.cons, <a class="indexterm" href="#classes.__mutable_buffer__constructors">mutable_buffer constructors</a></dt><dt>buffer.read, <a class="indexterm" href="#functions.read">Synchronous read operations</a></dt><dt>buffer.read.until, <a class="indexterm" href="#functions.read_until">Synchronous delimited read operations</a></dt><dt>buffer.reqmts, <a class="indexterm" href="#network.buffers_requirements">Requirements</a></dt><dt>buffer.reqmts.async.read, <a class="indexterm" href="#requirements.asynchronous_read_operations">Requirements on asynchronous read operations</a></dt><dt>buffer.reqmts.async.write, <a class="indexterm" href="#requirements.asynchronous_write_operations">Requirements on asynchronous write operations</a></dt><dt>buffer.reqmts.asyncreadstream, <a class="indexterm" href="#requirements.async_read_stream">Buffer-oriented asynchronous read stream requirements</a></dt><dt>buffer.reqmts.asyncwritestream, <a class="indexterm" href="#requirements.async_write_stream">Buffer-oriented asynchronous write stream requirements</a></dt><dt>buffer.reqmts.constbuffersequence, <a class="indexterm" href="#requirements.const_buffers">Constant buffer sequence requirements</a></dt><dt>buffer.reqmts.dynamicbuffer, <a class="indexterm" href="#requirements.dynamic_buffers">Dynamic buffer requirements</a></dt><dt>buffer.reqmts.mutablebuffersequence, <a class="indexterm" href="#requirements.mutable_buffers">Mutable buffer sequence requirements</a></dt><dt>buffer.reqmts.sync.read, <a class="indexterm" href="#requirements.synchronous_read_operations">Requirements on synchronous read operations</a></dt><dt>buffer.reqmts.sync.write, <a class="indexterm" href="#requirements.synchronous_write_operations">Requirements on synchronous write operations</a></dt><dt>buffer.reqmts.syncreadstream, <a class="indexterm" href="#requirements.sync_read_stream">Buffer-oriented synchronous read stream requirements</a></dt><dt>buffer.reqmts.syncwritestream, <a class="indexterm" href="#requirements.sync_write_stream">Buffer-oriented synchronous write stream requirements</a></dt><dt>buffer.size, <a class="indexterm" href="#functions.buffer_size">Function buffer_size</a></dt><dt>buffer.synop, <a class="indexterm" href="#headers.header____experimental_buffer___synopsis">Header &lt;experimental/buffer&gt; synopsis</a></dt><dt>buffer.traits, <a class="indexterm" href="#classes.buffer_type_traits">Buffer type traits</a></dt><dt>buffer.transfer.all, <a class="indexterm" href="#classes.transfer_all">Class transfer_all</a></dt><dt>buffer.transfer.at.least, <a class="indexterm" href="#classes.transfer_at_least">Class transfer_at_least</a></dt><dt>buffer.transfer.exactly, <a class="indexterm" href="#classes.transfer_exactly">Class transfer_exactly</a></dt><dt>buffer.write, <a class="indexterm" href="#functions.write">Synchronous write operations</a></dt></dl></div><div class="indexdiv"><h3>C</h3><dl><dt>conformance, <a class="indexterm" href="#conformance.conformance">Conformance</a></dt><dt>conformance.9945, <a class="indexterm" href="#conformance.posix_conformance">POSIX conformance</a></dt><dt>conformance.conditional, <a class="indexterm" href="#conformance.conditionally_supported_features">Conditionally-supported features</a></dt><dt>convenience.hdr, <a class="indexterm" href="#network.convenience">Convenience header</a></dt><dt>convenience.hdr.synop, <a class="indexterm" href="#headers.header____experimental_networking___synopsis">Header &lt;experimental/networking&gt; synopsis</a></dt></dl></div><div class="indexdiv"><h3>D</h3><dl><dt>defs, <a class="indexterm" href="#definitions.definitions">Definitions</a></dt><dt>defs.async.op, <a class="indexterm" href="#definitions.asynchronous_operation">asynchronous operation</a></dt><dt>defs.host.byte.order, <a class="indexterm" href="#definitions.host_byte_order">host byte order</a></dt><dt>defs.net.byte.order, <a class="indexterm" href="#definitions.network_byte_order">network byte order</a></dt><dt>defs.sync.op, <a class="indexterm" href="#definitions.synchronous_operation">synchronous operation</a></dt><dt>description, <a class="indexterm" href="#description.method_of_description__informative_">Method of description (Informative)</a></dt></dl></div><div class="indexdiv"><h3>E</h3><dl><dt>err.report, <a class="indexterm" href="#error_reporting.error_reporting">Error reporting</a></dt><dt>err.report.async, <a class="indexterm" href="#error_reporting.asynchronous_operations">Asynchronous operations</a></dt><dt>err.report.conditions, <a class="indexterm" href="#error_reporting.error_conditions">Error conditions</a></dt><dt>err.report.sync, <a class="indexterm" href="#error_reporting.synchronous_operations">Synchronous operations</a></dt></dl></div><div class="indexdiv"><h3>F</h3><dl><dt>feature.test, <a class="indexterm" href="#feature_test.feature_test_macros__informative_">Feature test macros (Informative)</a></dt><dt>fwd.decl, <a class="indexterm" href="#network.forward">Forward declarations</a></dt><dt>fwd.decl.synop, <a class="indexterm" href="#headers.header____experimental_netfwd___synopsis">Header &lt;experimental/netfwd&gt; synopsis</a></dt></dl></div><div class="indexdiv"><h3>I</h3><dl><dt>internet, <a class="indexterm" href="#network.internet_protocol">Internet protocol</a></dt><dt>internet.address, <a class="indexterm" href="#classes.ip__address">Class ip::address</a></dt><dt>internet.address.assign, <a class="indexterm" href="#classes.__ip__address__assignment">ip::address assignment</a></dt><dt>internet.address.cast, <a class="indexterm" href="#functions.ip__address_cast">Function ip::address_cast</a></dt><dt>internet.address.comparisons, <a class="indexterm" href="#classes.ip__address__comparisons">ip::address comparisons</a></dt><dt>internet.address.cons, <a class="indexterm" href="#classes.__ip__address__constructors">ip::address constructors</a></dt><dt>internet.address.creation, <a class="indexterm" href="#classes.ip__address__creation">ip::address creation</a></dt><dt>internet.address.io, <a class="indexterm" href="#classes.ip__address__io">ip::address I/O</a></dt><dt>internet.address.iter, <a class="indexterm" href="#classes.ip__basic_address_iterator">Class template ip::basic_address_iterator specializations</a></dt><dt>internet.address.members, <a class="indexterm" href="#classes.__ip__address__members">ip::address members</a></dt><dt>internet.address.range, <a class="indexterm" href="#classes.ip__basic_address_range">Class template ip::basic_address_range specializations</a></dt><dt>internet.address.v4, <a class="indexterm" href="#classes.ip__address_v4">Class ip::address_v4</a></dt><dt>internet.address.v4.assign, <a class="indexterm" href="#classes.__ip__address_v4__assignment">ip::address_v4 assignment</a></dt><dt>internet.address.v4.bytes, <a class="indexterm" href="#classes.struct___ip__address_v4__bytes_type_">Struct ip::address_v4::bytes_type</a></dt><dt>internet.address.v4.comparisons, <a class="indexterm" href="#classes.ip__address_v4__comparisons">ip::address_v4 comparisons</a></dt><dt>internet.address.v4.cons, <a class="indexterm" href="#classes.__ip__address_v4__constructors">ip::address_v4 constructors</a></dt><dt>internet.address.v4.creation, <a class="indexterm" href="#classes.ip__address_v4__creation">ip::address_v4 creation</a></dt><dt>internet.address.v4.io, <a class="indexterm" href="#classes.ip__address_v4__io">ip::address_v4 I/O</a></dt><dt>internet.address.v4.members, <a class="indexterm" href="#classes.__ip__address_v4__members">ip::address_v4 members</a></dt><dt>internet.address.v4.static, <a class="indexterm" href="#classes.__ip__address_v4__static_members">ip::address_v4 static members</a></dt><dt>internet.address.v6, <a class="indexterm" href="#classes.ip__address_v6">Class ip::address_v6</a></dt><dt>internet.address.v6.assign, <a class="indexterm" href="#classes.__ip__address_v6__assignment">ip::address_v6 assignment</a></dt><dt>internet.address.v6.bytes, <a class="indexterm" href="#classes.struct___ip__address_v6__bytes_type_">Struct ip::address_v6::bytes_type</a></dt><dt>internet.address.v6.comparisons, <a class="indexterm" href="#classes.ip__address_v6__comparisons">ip::address_v6 comparisons</a></dt><dt>internet.address.v6.cons, <a class="indexterm" href="#classes.__ip__address_v6__constructors">ip::address_v6 constructors</a></dt><dt>internet.address.v6.creation, <a class="indexterm" href="#classes.ip__address_v6__creation">ip::address_v6 creation</a></dt><dt>internet.address.v6.io, <a class="indexterm" href="#classes.ip__address_v6__io">ip::address_v6 I/O</a></dt><dt>internet.address.v6.members, <a class="indexterm" href="#classes.__ip__address_v6__members">ip::address_v6 members</a></dt><dt>internet.address.v6.static, <a class="indexterm" href="#classes.__ip__address_v6__static_members">ip::address_v6 static members</a></dt><dt>internet.bad.address.cast, <a class="indexterm" href="#classes.ip__bad_address_cast">Class ip::bad_address_cast</a></dt><dt>internet.endpoint, <a class="indexterm" href="#classes.ip__basic_endpoint">Class template ip::basic_endpoint</a></dt><dt>internet.endpoint.comparisons, <a class="indexterm" href="#classes.__ip__basic_endpoint__comparisons">ip::basic_endpoint comparisons</a></dt><dt>internet.endpoint.cons, <a class="indexterm" href="#classes.__ip__basic_endpoint__constructors">ip::basic_endpoint constructors</a></dt><dt>internet.endpoint.extensible, <a class="indexterm" href="#classes.__ip__basic_endpoint__members__extensible_implementations_">ip::basic_endpoint members (extensible implementations)</a></dt><dt>internet.endpoint.io, <a class="indexterm" href="#classes.__ip__basic_endpoint__i_o">ip::basic_endpoint I/O</a></dt><dt>internet.endpoint.members, <a class="indexterm" href="#classes.__ip__basic_endpoint__members">ip::basic_endpoint members</a></dt><dt>internet.hash, <a class="indexterm" href="#classes.hash">Hash support</a></dt><dt>internet.host.name, <a class="indexterm" href="#functions.ip__host_name">Host name functions</a></dt><dt>internet.multicast.enable.loopback, <a class="indexterm" href="#classes.ip__multicast__enable_loopback">Class ip::multicast::enable_loopback</a></dt><dt>internet.multicast.group, <a class="indexterm" href="#classes.ip__multicast__group_socket_options">Multicast group management socket options</a></dt><dt>internet.multicast.group.cons, <a class="indexterm" href="#classes.multicast_group_management_socket_option_constructors">Multicast group management socket option constructors</a></dt><dt>internet.multicast.group.extensible, <a class="indexterm" href="#classes.multicast_group_management_socket_option_members__extensible_implementations_">Multicast group management socket option members (extensible implementations)</a></dt><dt>internet.multicast.hops, <a class="indexterm" href="#classes.ip__multicast__hops">Class ip::multicast::hops</a></dt><dt>internet.multicast.outbound, <a class="indexterm" href="#classes.ip__multicast__outbound_interface">Class ip::multicast::outbound_interface</a></dt><dt>internet.multicast.outbound.cons, <a class="indexterm" href="#classes.__ip__multicast__outbound_interface__constructors">ip::multicast::outbound_interface constructors</a></dt><dt>internet.multicast.outbound.extensible, <a class="indexterm" href="#classes.__ip__multicast__outbound_interface__members__extensible_implementations_">ip::multicast::outbound_interface members (extensible
          implementations)</a></dt><dt>internet.network.v4, <a class="indexterm" href="#classes.ip__network_v4">Class template ip::network_v4</a></dt><dt>internet.network.v4.comparisons, <a class="indexterm" href="#classes.ip__network_v4__comparisons">ip::network_v4 comparisons</a></dt><dt>internet.network.v4.cons, <a class="indexterm" href="#classes.__ip__network_v4__constructors">ip::network_v4 constructors</a></dt><dt>internet.network.v4.creation, <a class="indexterm" href="#classes.ip__network_v4__creation">ip::network_v4 creation</a></dt><dt>internet.network.v4.io, <a class="indexterm" href="#classes.ip__network_v4__io">ip::network_v4 I/O</a></dt><dt>internet.network.v4.members, <a class="indexterm" href="#classes.__ip__network_v4__members">ip::network_v4 members</a></dt><dt>internet.network.v6, <a class="indexterm" href="#classes.ip__network_v6">Class template ip::network_v6</a></dt><dt>internet.network.v6.comparisons, <a class="indexterm" href="#classes.ip__network_v6__comparisons">ip::network_v6 comparisons</a></dt><dt>internet.network.v6.cons, <a class="indexterm" href="#classes.__ip__network_v6__constructors">ip::network_v6 constructors</a></dt><dt>internet.network.v6.creation, <a class="indexterm" href="#classes.ip__network_v6__creation">ip::network_v6 creation</a></dt><dt>internet.network.v6.io, <a class="indexterm" href="#classes.ip__network_v6__io">ip::network_v6 I/O</a></dt><dt>internet.network.v6.members, <a class="indexterm" href="#classes.__ip__network_v6__members">ip::network_v6 members</a></dt><dt>internet.reqmts, <a class="indexterm" href="#network.internet_protocol_requirements">Requirements</a></dt><dt>internet.reqmts.protocol, <a class="indexterm" href="#requirements.internet_protocol">Internet protocol requirements</a></dt><dt>internet.resolver, <a class="indexterm" href="#classes.ip__basic_resolver">Class template ip::basic_resolver</a></dt><dt>internet.resolver.assign, <a class="indexterm" href="#classes.__ip__basic_resolver__assignment">ip::basic_resolver assignment</a></dt><dt>internet.resolver.base, <a class="indexterm" href="#classes.ip__resolver_base">Class ip::resolver_base</a></dt><dt>internet.resolver.cons, <a class="indexterm" href="#classes.__ip__basic_resolver__constructors">ip::basic_resolver constructors</a></dt><dt>internet.resolver.dtor, <a class="indexterm" href="#classes.__ip__basic_resolver__destructor">ip::basic_resolver destructor</a></dt><dt>internet.resolver.entry, <a class="indexterm" href="#classes.ip__basic_resolver_entry">Class template ip::basic_resolver_entry</a></dt><dt>internet.resolver.entry.comparisons, <a class="indexterm" href="#classes.__op__basic_resolver_entry__comparisons">op::basic_resolver_entry comparisons</a></dt><dt>internet.resolver.entry.cons, <a class="indexterm" href="#classes.__ip__basic_resolver_entry__constructors">ip::basic_resolver_entry constructors</a></dt><dt>internet.resolver.entry.members, <a class="indexterm" href="#classes.__ip__basic_resolver_entry__members">ip::basic_resolver_entry members</a></dt><dt>internet.resolver.err, <a class="indexterm" href="#classes.ip__resolver_errc">Error codes</a></dt><dt>internet.resolver.ops, <a class="indexterm" href="#classes.__ip__basic_resolver__operations">ip::basic_resolver operations</a></dt><dt>internet.resolver.results, <a class="indexterm" href="#classes.ip__basic_resolver_results">Class template ip::basic_resolver_results</a></dt><dt>internet.resolver.results.access, <a class="indexterm" href="#classes.__ip__basic_resolver_results__element_access">ip::basic_resolver_results element access</a></dt><dt>internet.resolver.results.assign, <a class="indexterm" href="#classes.__ip__basic_resolver_results__assignment">ip::basic_resolver_results assignment</a></dt><dt>internet.resolver.results.comparisons, <a class="indexterm" href="#classes.__ip__basic_resolver_results__comparisons">ip::basic_resolver_results comparisons</a></dt><dt>internet.resolver.results.cons, <a class="indexterm" href="#classes.__ip__basic_resolver_results__constructors">ip::basic_resolver_results constructors</a></dt><dt>internet.resolver.results.size, <a class="indexterm" href="#classes.__ip__basic_resolver_results__size">ip::basic_resolver_results size</a></dt><dt>internet.resolver.results.swap, <a class="indexterm" href="#classes.__ip__basic_resolver_results__swap">ip::basic_resolver_results swap</a></dt><dt>internet.synop, <a class="indexterm" href="#headers.header____experimental_internet___synopsis">Header &lt;experimental/internet&gt; synopsis</a></dt><dt>internet.tcp, <a class="indexterm" href="#classes.ip__tcp">Class ip::tcp</a></dt><dt>internet.tcp.comparisons, <a class="indexterm" href="#classes.__ip__tcp__comparisons">ip::tcp comparisons</a></dt><dt>internet.tcp.nodelay, <a class="indexterm" href="#classes.ip__tcp__no_delay">Class ip::tcp::no_delay</a></dt><dt>internet.udp, <a class="indexterm" href="#classes.ip__udp">Class ip::udp</a></dt><dt>internet.udp.comparisons, <a class="indexterm" href="#classes.__ip__udp__comparisons">ip::udp comparisons</a></dt><dt>internet.unicast.hops, <a class="indexterm" href="#classes.ip__unicast__hops">Class ip::unicast::hops</a></dt><dt>internet.v6only, <a class="indexterm" href="#classes.ip__v6_only">Class ip::v6_only</a></dt><dt>io_service, <a class="indexterm" href="#network.basic_io_services">Basic I/O services</a></dt><dt>io_service.exec, <a class="indexterm" href="#classes.io_service__executor_type">Class io_service::executor_type</a></dt><dt>io_service.exec.assign, <a class="indexterm" href="#classes.__io_service__executor_type__assignment">io_service::executor_type assignment</a></dt><dt>io_service.exec.comparisons, <a class="indexterm" href="#classes.__io_service__executor_type__comparisons">io_service::executor_type comparisons</a></dt><dt>io_service.exec.cons, <a class="indexterm" href="#classes.__io_service__executor_type__constructors">io_service::executor_type constructors</a></dt><dt>io_service.exec.ops, <a class="indexterm" href="#classes.__io_service__executor_type__operations">io_service::executor_type operations</a></dt><dt>io_service.io_service, <a class="indexterm" href="#classes.io_service">Class io_service</a></dt><dt>io_service.io_service.members, <a class="indexterm" href="#classes.__io_service__members">io_service members</a></dt><dt>io_service.synop, <a class="indexterm" href="#headers.header____experimental_io_service___synopsis">Header &lt;experimental/io_service&gt; synopsis</a></dt></dl></div><div class="indexdiv"><h3>N</h3><dl><dt>namespaces, <a class="indexterm" href="#namespaces.namespaces_and_headers">Namespaces and headers</a></dt></dl></div><div class="indexdiv"><h3>P</h3><dl><dt>plans, <a class="indexterm" href="#plans.future_plans__informative_">Future plans (Informative)</a></dt></dl></div><div class="indexdiv"><h3>R</h3><dl><dt>references, <a class="indexterm" href="#references.normative_references">Normative references</a></dt></dl></div><div class="indexdiv"><h3>S</h3><dl><dt>scope, <a class="indexterm" href="#scope.scope">Scope</a></dt><dt>socket, <a class="indexterm" href="#network.sockets">Sockets</a></dt><dt>socket.acceptor, <a class="indexterm" href="#classes.basic_socket_acceptor">Class template basic_socket_acceptor</a></dt><dt>socket.acceptor.assign, <a class="indexterm" href="#classes.__basic_socket_acceptor__assignment">basic_socket_acceptor assignment</a></dt><dt>socket.acceptor.cons, <a class="indexterm" href="#classes.__basic_socket_acceptor__constructors">basic_socket_acceptor constructors</a></dt><dt>socket.acceptor.dtor, <a class="indexterm" href="#classes.__basic_socket_acceptor__destructor">basic_socket_acceptor destructor</a></dt><dt>socket.acceptor.ops, <a class="indexterm" href="#classes.__basic_socket_acceptor__operations">basic_socket_acceptor operations</a></dt><dt>socket.algo, <a class="indexterm" href="#network.socket_algorithms">Socket algorithms</a></dt><dt>socket.algo.async.connect, <a class="indexterm" href="#functions.async_connect">Asynchronous connect operations</a></dt><dt>socket.algo.connect, <a class="indexterm" href="#functions.connect">Synchronous connect operations</a></dt><dt>socket.base, <a class="indexterm" href="#classes.socket_base">Class socket_base</a></dt><dt>socket.base.int.extensible, <a class="indexterm" href="#classes.integral_socket_option_members__extensible_implementations_">Integral socket option members (extensible implementations)</a></dt><dt>socket.basic, <a class="indexterm" href="#classes.basic_socket">Class template basic_socket</a></dt><dt>socket.basic.assign, <a class="indexterm" href="#classes.__basic_socket__assignment">basic_socket assignment</a></dt><dt>socket.basic.cons, <a class="indexterm" href="#classes.__basic_socket__constructors">basic_socket constructors</a></dt><dt>socket.basic.dtor, <a class="indexterm" href="#classes.__basic_socket__destructor">basic_socket destructor</a></dt><dt>socket.basic.ops, <a class="indexterm" href="#classes.__basic_socket__operations">basic_socket operations</a></dt><dt>socket.dgram, <a class="indexterm" href="#classes.basic_datagram_socket">Class template basic_datagram_socket</a></dt><dt>socket.dgram.assign, <a class="indexterm" href="#classes.__basic_datagram_socket__assignment">basic_datagram_socket assignment</a></dt><dt>socket.dgram.cons, <a class="indexterm" href="#classes.__basic_datagram_socket__constructors">basic_datagram_socket constructors</a></dt><dt>socket.dgram.op, <a class="indexterm" href="#classes.__basic_datagram_socket__operations">basic_datagram_socket operations</a></dt><dt>socket.err, <a class="indexterm" href="#classes.socket_errc">Error codes</a></dt><dt>socket.iostream, <a class="indexterm" href="#classes.basic_socket_iostream">Class template basic_socket_iostream</a></dt><dt>socket.iostream.cons, <a class="indexterm" href="#classes.__basic_socket_iostream__constructors">basic_socket_iostream constructors</a></dt><dt>socket.iostream.members, <a class="indexterm" href="#classes.__basic_socket_iostream__members">basic_socket_iostream members</a></dt><dt>socket.iostreams, <a class="indexterm" href="#network.socket_streams">Socket iostreams</a></dt><dt>socket.opt.bool, <a class="indexterm" href="#classes.socket_base__bool_socket_options">Boolean socket options</a></dt><dt>socket.opt.bool.cons, <a class="indexterm" href="#classes.boolean_socket_option_constructors">Boolean socket option constructors</a></dt><dt>socket.opt.bool.extensible, <a class="indexterm" href="#classes.boolean_socket_option_members__extensible_implementations_">Boolean socket option members (extensible implementations)</a></dt><dt>socket.opt.bool.members, <a class="indexterm" href="#classes.boolean_socket_option_members">Boolean socket option members</a></dt><dt>socket.opt.int, <a class="indexterm" href="#classes.socket_base__int_socket_options">Integral socket options</a></dt><dt>socket.opt.int.cons, <a class="indexterm" href="#classes.integral_socket_option_constructors">Integral socket option constructors</a></dt><dt>socket.opt.int.members, <a class="indexterm" href="#classes.integral_socket_option_members">Integral socket option members</a></dt><dt>socket.opt.linger, <a class="indexterm" href="#classes.socket_base__linger">Class socket_base::linger</a></dt><dt>socket.opt.linger.cons, <a class="indexterm" href="#classes.__socket_base__linger__constructors">socket_base::linger constructors</a></dt><dt>socket.opt.linger.extensible, <a class="indexterm" href="#classes.__socket_base__linger__members__extensible_implementations_">socket_base::linger members (extensible implementations)</a></dt><dt>socket.opt.linger.members, <a class="indexterm" href="#classes.__socket_base__linger__members">socket_base::linger members</a></dt><dt>socket.reqmts, <a class="indexterm" href="#network.sockets_requirements">Requirements</a></dt><dt>socket.reqmts.acceptableprotocol, <a class="indexterm" href="#requirements.acceptable_protocol">Acceptable protocol requirements</a></dt><dt>socket.reqmts.connectcondition, <a class="indexterm" href="#requirements.connect_condition">Connect condition requirements</a></dt><dt>socket.reqmts.endpoint, <a class="indexterm" href="#requirements.endpoint">Endpoint requirements</a></dt><dt>socket.reqmts.gettablesocketoption, <a class="indexterm" href="#requirements.gettable_socket_option">Gettable socket option requirements</a></dt><dt>socket.reqmts.iocontrolcommand, <a class="indexterm" href="#requirements.io_control_command">I/O control command requirements</a></dt><dt>socket.reqmts.native, <a class="indexterm" href="#requirements.native_handles">Native handles</a></dt><dt>socket.reqmts.protocol, <a class="indexterm" href="#requirements.protocol">Protocol requirements</a></dt><dt>socket.reqmts.settablesocketoption, <a class="indexterm" href="#requirements.settable_socket_option">Settable socket option requirements</a></dt><dt>socket.stream, <a class="indexterm" href="#classes.basic_stream_socket">Class template basic_stream_socket</a></dt><dt>socket.stream.assign, <a class="indexterm" href="#classes.__basic_stream_socket__assignment">basic_stream_socket assignment</a></dt><dt>socket.stream.cons, <a class="indexterm" href="#classes.__basic_stream_socket__constructors">basic_stream_socket constructors</a></dt><dt>socket.stream.ops, <a class="indexterm" href="#classes.__basic_stream_socket__operations">basic_stream_socket operations</a></dt><dt>socket.streambuf, <a class="indexterm" href="#classes.basic_socket_streambuf">Class template basic_socket_streambuf</a></dt><dt>socket.streambuf.cons, <a class="indexterm" href="#classes.__basic_socket_streambuf__constructors">basic_socket_streambuf constructors</a></dt><dt>socket.streambuf.members, <a class="indexterm" href="#classes.__basic_socket_streambuf__members">basic_socket_streambuf members</a></dt><dt>socket.streambuf.virtual, <a class="indexterm" href="#classes.__basic_socket_streambuf__overridden_virtual_functions">basic_socket_streambuf overridden virtual functions</a></dt><dt>socket.synop, <a class="indexterm" href="#headers.header____experimental_socket___synopsis">Header &lt;experimental/socket&gt; synopsis</a></dt><dt>structure, <a class="indexterm" href="#description.structure_of_each_clause">Structure of each clause</a></dt><dt>structure.specifications, <a class="indexterm" href="#description.detailed_specifications">Detailed specifications</a></dt><dt>summary, <a class="indexterm" href="#network.library_summary">Library summary</a></dt></dl></div><div class="indexdiv"><h3>T</h3><dl><dt>timer, <a class="indexterm" href="#network.timers">Timers</a></dt><dt>timer.reqmts, <a class="indexterm" href="#network.timers_requirements">Requirements</a></dt><dt>timer.reqmts.waittraits, <a class="indexterm" href="#requirements.wait_traits">Wait traits requirements</a></dt><dt>timer.synop, <a class="indexterm" href="#headers.header____experimental_timer___synopsis">Header &lt;experimental/timer&gt; synopsis</a></dt><dt>timer.waitable, <a class="indexterm" href="#classes.basic_waitable_timer">Class template basic_waitable_timer</a></dt><dt>timer.waitable.assign, <a class="indexterm" href="#classes.__basic_waitable_timer__assignment">basic_waitable_timer assignment</a></dt><dt>timer.waitable.cons, <a class="indexterm" href="#classes.__basic_waitable_timer__constructors">basic_waitable_timer constructors</a></dt><dt>timer.waitable.dtor, <a class="indexterm" href="#classes.__basic_waitable_timer__destructor">basic_waitable_timer destructor</a></dt><dt>timer.waitable.ops, <a class="indexterm" href="#classes.__basic_waitable_timer__operations">basic_waitable_timer operations</a></dt></dl></div></div></div><p>

      </p></div></div><div class="section" title="11.&#160;Acknowledgements"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.acknowledgements"></a>11.&#160;Acknowledgements</h2></div></div></div><p>
      In the eleven years since Asio's inception, hundreds of people have contributed
      to its development through design review, patches, feature suggestions, bug
      reports, and usage feedback from the field. With respect to the 2014 refresh
      of the Networking Library Proposal, the author would particularly like to thank
      Jamie Allsop for providing feedback during the drafting process, and Oliver
      Kowalke for contributing towards the design and implementation of the CIDR
      support.
    </p><p>
      Thanks go to Marshall Clow, Jens Maurer, Arash Partow, Jamie Allsop, Dietmar
      K&#252;hl, Detlef Vollmann, Jonathan Wakely, Mikael Kilpel&#228;inen, Jens Weller,
      Michael Wong, Eric Fisselier, and Jeffrey Yasskin for participating in the
      Cologne wording review, and also to Roger Orr for some pre-Cologne review feedback.
    </p></div><div class="section" title="12.&#160;References"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="network.references"></a>12.&#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-N4242"></a>[N4242] Kohlhoff, Christopher, <span class="emphasis"><em>Executors
      and Asynchronous Operations, Revision 1</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 class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.references.proposed_text.normative_references.f0" href="#references.proposed_text.normative_references.f0" class="para">1</a>] </sup>
          POSIX&#174; is a registered trademark of The IEEE. Windows&#174; is a registered
          trademark of Microsoft Corporation. This information is given for the convenience
          of users of this document and does not constitute an endorsement by ISO
          or IEC of these products.
        </p></div></div></div></body></html>
