<html><head><style>blockquote pre.programlisting { margin-left: 1em; padding-left: 1em; }
div.table { text-align: center; }
p.sidebar { background-color: #e0e0e0; font-style: italic; }
p.tablecaption { font-weight: bold; }
table { margin: auto; }</style><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>A Three-Class IP Address Proposal, Revision 1</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:  N4044 
Date:     2014-05-24
Revises:  N3603
Reply-To: Christopher Kohlhoff &lt;chris@kohlhoff.com&gt;
</pre>
<div class="chapter" title="A Three-Class IP Address Proposal, Revision 1"><div class="titlepage"><div><div><h2 class="title"><a name="ipaddress"></a>A Three-Class IP Address Proposal, Revision 1</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#ipaddress.overview">1. Overview</a></span></dt><dt><span class="section"><a href="#ipaddress.motivation_and_scope">2. Motivation and Scope</a></span></dt><dd><dl><dt><span class="section"><a href="#ipaddress.scope">2.1. Scope</a></span></dt><dt><span class="section"><a href="#ipaddress.target_audience">2.2. Target Audience</a></span></dt><dt><span class="section"><a href="#ipaddress.reference_implementation">2.3. Reference Implementation</a></span></dt></dl></dd><dt><span class="section"><a href="#ipaddress.impact_on_the_standard">3. Impact On the Standard</a></span></dt><dt><span class="section"><a href="#ipaddress.design_decisions">4. Design Decisions</a></span></dt><dd><dl><dt><span class="section"><a href="#ipaddress.overloads_of_hton_and_ntoh">4.1. Overloads of hton and ntoh</a></span></dt><dt><span class="section"><a href="#ipaddress.specialisation_of_less__">4.2. Specialisation of less&lt;&gt;</a></span></dt></dl></dd><dt><span class="section"><a href="#ipaddress.further_work">5. Further Work</a></span></dt><dd><dl><dt><span class="section"><a href="#ipaddress.address_iteration">5.1. Address Iteration</a></span></dt></dl></dd><dt><span class="section"><a href="#ipaddress.proposed_text">6. Proposed Text</a></span></dt><dd><dl><dt><span class="section"><a href="#definitions.definitions">6.1. Definitions</a></span></dt><dd><dl><dt><span class="section"><a href="#definitions.host_byte_order">6.1.1. host byte order</a></span></dt><dt><span class="section"><a href="#definitions.network_byte_order">6.1.2. network byte order</a></span></dt></dl></dd><dt><span class="section"><a href="#error_reporting.error_reporting">6.2. Error reporting</a></span></dt><dt><span class="section"><a href="#ipaddress.internet_protocol">6.3. Internet protocol addresses</a></span></dt><dd><dl><dt><span class="section"><a href="#headers.header____experimental_net___synopsis">6.3.1. Header <code class="literal">&lt;experimental/net&gt;</code> synopsis</a></span></dt><dt><span class="section"><a href="#classes.ip__address">6.3.2. Class <code class="literal">ip::address</code></a></span></dt><dd><dl><dt><span class="section"><a href="#classes.__ip__address__constructors">6.3.2.1. <code class="literal">ip::address</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__assignment">6.3.2.2. <code class="literal">ip::address</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address__members">6.3.2.3. <code class="literal">ip::address</code> members</a></span></dt><dt><span class="section"><a href="#classes.ip__address__comparisons">6.3.2.4. <code class="literal">ip::address</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address__creation">6.3.2.5. <code class="literal">ip::address</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address__io">6.3.2.6. <code class="literal">ip::address</code> I/O</a></span></dt></dl></dd><dt><span class="section"><a href="#classes.ip__address_v4">6.3.3. 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_">6.3.3.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">6.3.3.2. <code class="literal">ip::address_v4</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__assignment">6.3.3.3. <code class="literal">ip::address_v4</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__members">6.3.3.4. <code class="literal">ip::address_v4</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v4__static_members">6.3.3.5. <code class="literal">ip::address_v4</code> static members</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__comparisons">6.3.3.6. <code class="literal">ip::address_v4</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__creation">6.3.3.7. <code class="literal">ip::address_v4</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v4__io">6.3.3.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">6.3.4. 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_">6.3.4.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">6.3.4.2. <code class="literal">ip::address_v6</code> constructors</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__assignment">6.3.4.3. <code class="literal">ip::address_v6</code> assignment</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__members">6.3.4.4. <code class="literal">ip::address_v6</code> members</a></span></dt><dt><span class="section"><a href="#classes.__ip__address_v6__static_members">6.3.4.5. <code class="literal">ip::address_v6</code> static members</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__comparisons">6.3.4.6. <code class="literal">ip::address_v6</code> comparisons</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__creation">6.3.4.7. <code class="literal">ip::address_v6</code> creation</a></span></dt><dt><span class="section"><a href="#classes.ip__address_v6__io">6.3.4.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">6.3.5. Class <code class="literal">ip::bad_address_cast</code></a></span></dt><dt><span class="section"><a href="#functions.ip__address_cast">6.3.6. Function <code class="literal">ip::address_cast</code></a></span></dt><dt><span class="section"><a href="#classes.hash">6.3.7. Hash support</a></span></dt><dt><span class="section"><a href="#functions.literals">6.3.8. Suffixes for address literals</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#ipaddress.changes">7. Changes in This Revision</a></span></dt><dd><dl><dt><span class="section"><a href="#ipaddress.namespace">7.1. Namespace</a></span></dt><dt><span class="section"><a href="#ipaddress.a_version_independent_vocabulary_type">7.2. A Version-Independent Vocabulary Type</a></span></dt><dt><span class="section"><a href="#ipaddress.use_of_noexcept">7.3. Use of noexcept</a></span></dt><dt><span class="section"><a href="#ipaddress.explicit_creation_from_strings">7.4. Explicit Creation from Strings</a></span></dt><dt><span class="section"><a href="#ipaddress.string_literals">7.5. String Literals</a></span></dt><dt><span class="section"><a href="#ipaddress.bytes_type">7.6. Strongly-Typed Byte Representations</a></span></dt><dt><span class="section"><a href="#ipaddress.use_of_constexpr">7.7. Use of constexpr</a></span></dt><dt><span class="section"><a href="#ipaddress.make_default_constructed_address_invalid">7.8. Make Default-Constructed address Invalid</a></span></dt><dt><span class="section"><a href="#ipaddress.removed_address_v4__netmask">7.9. Removed address_v4::netmask</a></span></dt></dl></dd><dt><span class="section"><a href="#ipaddress.acknowledgements">8. Acknowledgements</a></span></dt><dt><span class="section"><a href="#ipaddress.references">9. References</a></span></dt></dl></div><div class="section" title="1. Overview"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.overview"></a>1. Overview</h2></div></div></div><p>
      This proposal describes a three-class design for IP address classes:
    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
          A vocabulary type, <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span></code>, for use in IP version independent
          code.
        </li><li class="listitem">
          An IPv4-specific type <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span></code>.
        </li><li class="listitem">
          An IPv6-specific type <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span></code>.
        </li></ul></div></div><div class="section" title="2. Motivation and Scope"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.motivation_and_scope"></a>2. Motivation and Scope</h2></div></div></div><div class="section" title="2.1. Scope"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.scope"></a>2.1. Scope</h3></div></div></div><p>
        This proposal describes only types necessary to support the manipulation
        of IP (Internet Protocol) addresses. Other networking facilities, such as
        sockets and name resolution, are outside the scope of this proposal.
      </p></div><div class="section" title="2.2. Target Audience"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.target_audience"></a>2.2. Target Audience</h3></div></div></div><p>
        The proposed interface is primarily intended for use by developers writing
        programs with a networking component, and in particular programs that utilise
        internet protocols such as TCP and UDP.
      </p></div><div class="section" title="2.3. Reference Implementation"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.reference_implementation"></a>2.3. Reference Implementation</h3></div></div></div><p>
        This proposal is based on the IP address classes in the <a class="ulink" href="http://www.boost.org/libs/asio" target="_top">Boost.Asio</a>
        library. The proposed text was originally from <a class="ulink" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2175.pdf" target="_top">N2175</a>
        "Networking Library Proposal for TR2 (Revision 1)" with small modifications
        to reflect enhancements made to <a class="ulink" href="http://www.boost.org/libs/asio" target="_top">Boost.Asio</a>
        since 2007.
      </p><p>
        In this revision, the proposed text has been updated to reflect feedback
        and discussion from the Bristol 2013 meeting of SG4. A reference implementation
        of the proposal is available from <a class="ulink" href="https://github.com/chriskohlhoff/ip-address" target="_top">GitHub</a>.
      </p></div></div><div class="section" title="3. Impact On the Standard"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.impact_on_the_standard"></a>3. 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.
    </p><p>
      This library can be implemented using compilers that conform to the C++11 standard.
      An implementation of this library requires operating system-specific functions
      that lie outside the C++11 standard.
    </p></div><div class="section" title="4. Design Decisions"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.design_decisions"></a>4. Design Decisions</h2></div></div></div><p>
      For more information on the motivating design decisions for the three-class
      design, please consult <a class="ulink" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3603.html" target="_top">N3603</a>.
    </p><p>
      In this section we list some of the additional proposed changes that were considered
      but rejected. The changes incorporated since N3603 are described <a class="link" href="#ipaddress.changes" title="7. Changes in This Revision">at
      the end</a>.
    </p><div class="section" title="4.1. Overloads of hton and ntoh"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.overloads_of_hton_and_ntoh"></a>4.1. Overloads of hton and ntoh</h3></div></div></div><p>
        One suggestion was that the proposal should include overloads of <code class="computeroutput"><span class="identifier">hton</span></code> and <code class="computeroutput"><span class="identifier">ntoh</span></code>
        for the address types. The motivating use case was that address objects may
        be used directly as part of standard-layout aggregates that are ultimately
        intended for network transmission.
      </p><p>
        This change was rejected on the basis that the applying <code class="computeroutput"><span class="identifier">hton</span></code>
        to a class type (as opposed to a simple integer) may result in an object
        that is in an invalid or nonsensical state. As a matter of style, the author
        feels that the address types should be treated as abstractions without necessarily
        forcing a particular internal implementation.
      </p><p>
        The addresses' <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span></code>
        member functions can already be used to obtain a representation of the address
        in network byte order. To further aid the motivating use case, the <code class="computeroutput"><span class="identifier">bytes_type</span></code> types have been changed to be
        <a class="link" href="#ipaddress.bytes_type" title="7.6. Strongly-Typed Byte Representations">unique types</a>.
      </p></div><div class="section" title="4.2. Specialisation of less&lt;&gt;"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.specialisation_of_less__"></a>4.2. Specialisation of less&lt;&gt;</h3></div></div></div><p>
        Another suggestion was that the address types should specialise <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special">&lt;&gt;</span></code> rather than provide <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
        and friends. This change was rejected since it would appear to render the
        address types incompatible with other standard library types, such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;&gt;</span></code>, which apply <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code> to their elements.
      </p></div></div><div class="section" title="5. Further Work"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.further_work"></a>5. Further Work</h2></div></div></div><div class="section" title="5.1. Address Iteration"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.address_iteration"></a>5.1. Address Iteration</h3></div></div></div><p>
        It has been suggested in the SG4 discussion forum that the address classes
        include the ability to determine the predecessor or successor of an address.
        By this we mean that given an address 1.2.3.4, the predecessor address is
        1.2.3.3 and the successor is 1.2.3.5.
      </p><p>
        The author feels that this feature is not a core responsibility of the address
        classes, but if it is desired it can instead be supported by a richer range-based
        interface. The following is a sketch of this approach:
      </p><pre class="programlisting"><span class="keyword">class</span> <span class="identifier">address_iterator_v4</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</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">address_v4</span> <span class="identifier">value_type</span><span class="special">;</span>
  <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span>
  <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">reference</span><span class="special">;</span>
  <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bidirectional_iterator_tag</span> <span class="identifier">iterator_category</span><span class="special">;</span>

  <span class="keyword">explicit</span> <span class="identifier">address_iterator_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>

  <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>

  <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">++();</span>
  <span class="identifier">address_iterator_v4</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">);</span>

  <span class="identifier">address_iterator_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">--();</span>
  <span class="identifier">address_iterator_v4</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">);</span>

  <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_iterator_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_iterator_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>
  <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_iterator_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_iterator_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">);</span>

<span class="keyword">private</span><span class="special">:</span>
  <span class="comment">// ...</span>
<span class="special">};</span>

<span class="keyword">class</span> <span class="identifier">address_range_v4</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="identifier">address_range_v4</span><span class="special">();</span>
  <span class="keyword">explicit</span> <span class="identifier">address_range_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
  <span class="keyword">explicit</span> <span class="identifier">address_range_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">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">address_v4</span> <span class="identifier">network</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="identifier">address_v4</span> <span class="identifier">netmask</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>

  <span class="keyword">typedef</span> <span class="identifier">address_iterator_v4</span> <span class="identifier">iterator</span><span class="special">;</span>
  <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</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="special">;</span>
  <span class="identifier">iterator</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

<span class="keyword">private</span><span class="special">:</span>
  <span class="comment">// ...</span>
<span class="special">};</span>
</pre><p>
        This may be used as in the following example:
      </p><pre class="programlisting"><span class="identifier">address_range_v4</span> <span class="identifier">range</span><span class="special">(</span>
    <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"192.168.1.0"</span><span class="special">),</span>
    <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"255.255.255.0"</span><span class="special">));</span>

<span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">a</span><span class="special">:</span> <span class="identifier">range</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">a</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="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"---"</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="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span>
    <span class="identifier">range</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"192.168.1.250"</span><span class="special">)),</span>
    <span class="identifier">range</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
    <span class="special">[](</span><span class="identifier">address_v4</span> <span class="identifier">a</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">a</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>
        If SG4 determines that this feature is desirable, it may be added to this
        proposal or developed as a separate proposal. The author favours the latter.
      </p></div></div><div class="section" title="6. Proposed Text"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.proposed_text"></a>6. Proposed Text</h2></div></div></div><div class="section" title="6.1. Definitions"><div class="titlepage"><div><div><h3 class="title"><a name="definitions.definitions"></a>6.1. Definitions</h3></div></div></div><div class="section" title="6.1.1. host byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.host_byte_order"></a>6.1.1. host byte order</h4></div></div></div><p>
          See section 1.4 of <a class="ulink" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3783.pdf" target="_top">N3783
          Network Byte Order Conversion</a>.
        </p></div><div class="section" title="6.1.2. network byte order"><div class="titlepage"><div><div><h4 class="title"><a name="definitions.network_byte_order"></a>6.1.2. network byte order</h4></div></div></div><p>
          See section 1.4 of <a class="ulink" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3783.pdf" target="_top">N3783
          Network Byte Order Conversion</a>.
        </p></div></div><div class="section" title="6.2. Error reporting"><div class="titlepage"><div><div><h3 class="title"><a name="error_reporting.error_reporting"></a>6.2. Error reporting</h3></div></div></div><p>
        Network library functions often provide two overloads, one that throws an
        exception to report system errors, and another that sets an <code class="computeroutput"><span class="identifier">error_code</span></code>.
      </p><p>
        [<span class="emphasis"><em>Note:</em></span> This supports two common use cases:<br> <br>
        &#8212; Uses where system errors are truly exceptional and indicate a serious failure.
        Throwing an exception is the most appropriate response. This is the preferred
        default for most everyday programming.<br> <br> &#8212; Uses where system errors
        are routine and do not necessarily represent failure. Returning an error
        code is the most appropriate response. This allows application specific error
        handling, including simply ignoring the error.<br> <br> &#8212;<span class="emphasis"><em>end
        note</em></span>]
      </p><p>
        Functions <span class="bold"><strong>not</strong></span> having an argument of type
        <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code>
        report errors as follows, unless otherwise specified:
      </p><p>
        &#8212; When a call by the implementation to an operating system or other underlying
        API results in an error that prevents the function from meeting its specifications,
        an exception of type <code class="computeroutput"><span class="identifier">system_error</span></code>
        shall be thrown.
      </p><p>
        &#8212; Failure to allocate storage is reported by throwing an exception as described
        in the C++ standard (C++14 [res.on.exception.handling]).
      </p><p>
        &#8212; Destructors throw nothing.
      </p><p>
        Functions having an argument of type <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code> report errors as follows, unless otherwise
        specified:
      </p><p>
        &#8212; If a call by the implementation to an operating system or other underlying
        API results in an error that prevents the function from meeting its specifications,
        the <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code>
        argument is set as appropriate for the specific error. Otherwise, <code class="computeroutput"><span class="identifier">clear</span><span class="special">()</span></code>
        is called on the <code class="computeroutput"><span class="identifier">error_code</span><span class="special">&amp;</span></code> argument.
      </p></div><div class="section" title="6.3. Internet protocol addresses"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.internet_protocol"></a>6.3. Internet protocol addresses</h3></div></div></div><p>
        This clause describes components that C++ programs may use to manipulate
        IP addresses.
      </p><div class="section" title="6.3.1. Header &lt;experimental/net&gt; synopsis"><div class="titlepage"><div><div><h4 class="title"><a name="headers.header____experimental_net___synopsis"></a>6.3.1. Header <code class="literal">&lt;experimental/net&gt;</code> synopsis</h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</span> <span class="special">{</span>

      <span class="comment">// Internet protocol addresses:</span>

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

        <span class="keyword">struct</span> <span class="identifier">v4_mapped_t</span> <span class="special">{};</span>
        <span class="identifier">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="6.3.2. Class ip::address">address</a><span class="special">;</span>
        <span class="keyword">class</span> <a class="link" href="#classes.ip__address_v4" title="6.3.3. 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="6.3.4. 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="6.3.5. 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="6.3.2.4. 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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v4__comparisons" title="6.3.3.6. 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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v6__comparisons" title="6.3.4.6. 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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address__creation" title="6.3.2.5. 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="identifier">noexcept</span><span class="special">;</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address</span> <span class="identifier">make_address</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v4__creation" title="6.3.3.7. ip::address_v4 creation">address_v4 creation</a>:</span>
        <span class="identifier">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">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">);</span>
        <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address_v6__creation" title="6.3.4.7. ip::address_v6 creation">address_v6 creation</a>:</span>
        <span class="identifier">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
        <span class="identifier">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">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="identifier">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;,</span> <span class="identifier">error_code</span><span class="special">&amp;)</span> <span class="identifier">noexcept</span><span class="special">;</span>

        <span class="comment">// <a class="link" href="#classes.ip__address__io" title="6.3.2.6. 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="6.3.3.8. 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="6.3.4.8. 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="6.3.6. 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="identifier">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">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="identifier">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">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="identifier">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">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    <span class="special">}</span> <span class="comment">// namespace net</span>

    <span class="comment">// <a class="link" href="#classes.hash" title="6.3.7. 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">net</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">net</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">net</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="keyword">inline</span> <span class="keyword">namespace</span> <span class="identifier">literals</span> <span class="special">{</span>
      <span class="keyword">inline</span> <span class="keyword">namespace</span> <span class="identifier">net_literals</span> <span class="special">{</span>

        <span class="comment">// <a class="link" href="#functions.literals" title="6.3.8. Suffixes for address literals">suffixes for address literals</a></span>
        <span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ip</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">size_t</span><span class="special">);</span>
        <span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ipv4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">size_t</span><span class="special">);</span>
        <span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ipv6</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*,</span> <span class="identifier">size_t</span><span class="special">);</span>

      <span class="special">}</span> <span class="comment">// namespace net_literals</span>
    <span class="special">}</span> <span class="comment">// namespace literals</span>
  <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="6.3.2. Class ip::address"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address"></a>6.3.2. Class <code class="literal">ip::address</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</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">public</span><span class="special">:</span>
          <span class="comment">// constructors:</span>
          <span class="identifier">constexpr</span> <span class="identifier">address</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">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">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="identifier">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">...</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">constexpr</span> <span class="identifier">address</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="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="identifier">noexcept</span><span class="special">;</span>

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

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

          <span class="comment">// members:</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">to_ulong</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

          <span class="comment">// static members:</span>
          <span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">any</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="keyword">static</span> <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

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

        <span class="comment">// address_v4 creation:</span>
        <span class="identifier">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="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>
        <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="identifier">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>
    <span class="special">}</span> <span class="comment">// namespace net</span>
  <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="6.3.3.1. Struct ip::address_v4::bytes_type"><div class="titlepage"><div><div><h5 class="title"><a name="classes.struct___ip__address_v4__bytes_type_"></a>6.3.3.1. Struct <code class="literal">ip::address_v4::bytes_type</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</span> <span class="special">{</span>
      <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="identifier">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>
    <span class="special">}</span> <span class="comment">// namespace net</span>
  <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="6.3.3.2. ip::address_v4 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__constructors"></a>6.3.3.2. <code class="literal">ip::address_v4</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="identifier">address_v4</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v4</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="idm438317621760"></a><p class="title"><b>Table 2. address_v4::address_v4() effects</b></p><div class="table-contents"><table summary="address_v4::address_v4() effects" border="1"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="special">{</span><span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span><span class="special">}</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="number">0</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="identifier">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="identifier">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="identifier">constexpr</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Each element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if any element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">UCHAR_MAX</span> <span class="special">==</span>
              <span class="number">0xFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">bytes</span></code> and <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">0</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">24</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">1</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">16</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="identifier">bytes</span><span class="special">[</span><span class="number">2</span><span class="special">]</span>
              <span class="special">&lt;&lt;</span> <span class="number">8</span><span class="special">)</span> <span class="special">|</span> <span class="identifier">bytes</span><span class="special">[</span><span class="number">3</span><span class="special">]</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">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="identifier">constexpr</span> <span class="identifier">address_v4</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>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless the expression <code class="computeroutput"><span class="identifier">make_address_v4</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><code class="computeroutput"><span class="special">.</span></code><code class="computeroutput"><span class="special">.)</span></code> is valid and yields an rvalue of
              type <code class="computeroutput"><span class="identifier">address_v4</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_v4</span></code> with the result of the
              expression <code class="computeroutput"><span class="identifier">make_address_v4</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><code class="computeroutput"><span class="special">.</span></code><code class="computeroutput"><span class="special">.)</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.3.3. ip::address_v4 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__assignment"></a>6.3.3.3. <code class="literal">ip::address_v4</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="identifier">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="6.3.3.4. ip::address_v4 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__members"></a>6.3.3.4. <code class="literal">ip::address_v4</code> members</h5></div></div></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xFF000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x7F000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0x80000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xC0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x80000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xE0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0xC0000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">(</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">&amp;</span> <span class="number">0xF0000000</span><span class="special">)</span> <span class="special">==</span> <span class="number">0xE0000000</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">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="6.1.2. network byte order">network byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">to_ulong</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">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="6.1.1. host byte order">host byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts an address into a string representation,
              as if by <span class="emphasis"><em>POSIX</em></span> <a class="ulink" href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_ntop.html" target="_top"><code class="computeroutput"><span class="identifier">inet_ntop</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, the string representation
              of the address. Otherwise <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.3.5. ip::address_v4 static members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v4__static_members"></a>6.3.3.5. <code class="literal">ip::address_v4</code> static members</h5></div></div></div><pre class="programlisting"><span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">any</span><span class="special">()</span> <span class="identifier">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="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="identifier">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="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">broadcast</span><span class="special">()</span> <span class="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">|</span> <span class="special">~</span><span class="identifier">mask</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">())</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.3.6. ip::address_v4 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__comparisons"></a>6.3.3.6. <code class="literal">ip::address_v4</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&gt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.3.7. ip::address_v4 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__creation"></a>6.3.3.7. <code class="literal">ip::address_v4</code> creation</h5></div></div></div><pre class="programlisting"><span class="identifier">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="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">val</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">val</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFFFFFFFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if <code class="computeroutput"><span class="identifier">val</span></code> is not in the
              range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFFFFFFFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">ULONG_MAX</span> <span class="special">==</span>
              <span class="number">0xFFFFFFFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An object <code class="computeroutput"><span class="identifier">a</span></code>
              of type <code class="computeroutput"><span class="identifier">address_v4</span></code>
              where <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_ulong</span><span class="special">()</span>
              <span class="special">==</span> <span class="identifier">val</span></code>
              and <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><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><pre class="programlisting"><span class="identifier">constexpr</span> <span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="identifier">v4_mapped_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4_mapped</span><span class="special">()</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An <code class="computeroutput"><span class="identifier">address_v4</span></code>
              object corresponding to the IPv4-mapped IPv6 address, as if computed
              by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">v6b</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">();</span>
<span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="identifier">v4b</span><span class="special">(</span><span class="identifier">v6b</span><span class="special">[</span><span class="number">12</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">13</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">14</span><span class="special">],</span> <span class="identifier">v6b</span><span class="special">[</span><span class="number">15</span><span class="special">]);</span>
<span class="keyword">return</span> <span class="identifier">address_v4</span><span class="special">(</span><span class="identifier">v4b</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
              if <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4_mapped</span><span class="special">()</span></code>
              is false.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v4</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts a string representation of an
              address into a corresponding <code class="computeroutput"><span class="identifier">address_v4</span></code>
              value, as if by <span class="emphasis"><em>POSIX</em></span> <a class="ulink" href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_pton.html" target="_top"><code class="computeroutput"><span class="identifier">inet_pton</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, an <code class="computeroutput"><span class="identifier">address_v4</span></code>
              value corresponding to the string <code class="computeroutput"><span class="identifier">str</span></code>.
              Otherwise <code class="computeroutput"><span class="identifier">address_v4</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.3.8. ip::address_v4 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v4__io"></a>6.3.3.8. <code class="literal">ip::address_v4</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v4</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the address to the stream, as if it were implemented as follows: 
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="6.3.4. Class ip::address_v6"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__address_v6"></a>6.3.4. Class <code class="literal">ip::address_v6</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</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_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="identifier">constexpr</span> <span class="identifier">address_v6</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope</span><span class="special">);</span>
          <span class="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="identifier">constexpr</span> <span class="identifier">address</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="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="identifier">noexcept</span><span class="special">;</span>

          <span class="comment">// members:</span>
          <span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">id</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
          <span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>

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

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

        <span class="comment">// address_v6 creation:</span>
        <span class="identifier">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span>
                                             <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
        <span class="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
        <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="identifier">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>
    <span class="special">}</span> <span class="comment">// namespace net</span>
  <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
          [<a class="link" href="#ref-RFC4291">RFC4291</a>]. &#8212;<span class="emphasis"><em>end note</em></span>]
        </p><div class="section" title="6.3.4.1. Struct ip::address_v6::bytes_type"><div class="titlepage"><div><div><h5 class="title"><a name="classes.struct___ip__address_v6__bytes_type_"></a>6.3.4.1. Struct <code class="literal">ip::address_v6::bytes_type</code></h5></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</span> <span class="special">{</span>
      <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="identifier">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>
    <span class="special">}</span> <span class="comment">// namespace net</span>
  <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="6.3.4.2. ip::address_v6 constructors"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__constructors"></a>6.3.4.2. <code class="literal">ip::address_v6</code> constructors</h5></div></div></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="identifier">address_v6</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v6</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> The postconditions of this function
              are indicated in the table below.
            </p></blockquote></div><div class="table"><a name="idm438316773824"></a><p class="title"><b>Table 3. address_v6::address_v6() effects</b></p><div class="table-contents"><table summary="address_v6::address_v6() effects" border="1"><colgroup><col><col></colgroup><thead><tr><th>
                    <p>
                      expression
                    </p>
                  </th><th>
                    <p>
                      value
                    </p>
                  </th></tr></thead><tbody><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">is_unspecified</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="keyword">true</span></code>
                    </p>
                  </td></tr><tr><td>
                    <p>
                      <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span></code>
                    </p>
                  </td><td>
                    <p>
                      <code class="computeroutput"><span class="number">0</span></code>
                    </p>
                  </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Constructs an object of class <code class="computeroutput"><span class="identifier">address_v6</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">a</span></code>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="identifier">address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Requires:</em></span> Each element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Throws:</em></span> <code class="computeroutput"><span class="identifier">out_of_range</span></code>
              if any element of <code class="computeroutput"><span class="identifier">bytes</span></code>
              is not in the range <code class="computeroutput"><span class="special">[</span><span class="number">0</span><span class="special">,</span> <span class="number">0xFF</span><span class="special">]</span></code>. [<span class="emphasis"><em>Note:</em></span> For implementations
              where <code class="computeroutput"><span class="identifier">UCHAR_MAX</span> <span class="special">==</span>
              <span class="number">0xFF</span></code>, no out-of-range detection
              is needed. &#8212;<span class="emphasis"><em>end note</em></span>]
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Postconditions:</em></span> <code class="computeroutput"><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">bytes</span></code> and <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">scope</span></code>.
            </p></blockquote></div><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">T</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">constexpr</span> <span class="identifier">address_v6</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>Remarks:</em></span> This constructor shall not participate
              in overload resolution unless the expression <code class="computeroutput"><span class="identifier">make_address_v6</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><code class="computeroutput"><span class="special">.</span></code><code class="computeroutput"><span class="special">.)</span></code> is valid and yields an rvalue of
              type <code class="computeroutput"><span class="identifier">address_v6</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_v6</span></code> with the result of the
              expression <code class="computeroutput"><span class="identifier">make_address_v6</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><code class="computeroutput"><span class="special">.</span></code><code class="computeroutput"><span class="special">.)</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.4.3. ip::address_v6 assignment"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__assignment"></a>6.3.4.3. <code class="literal">ip::address_v6</code> assignment</h5></div></div></div><pre class="programlisting"><span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">)</span> <span class="identifier">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="6.3.4.4. ip::address_v6 members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__members"></a>6.3.4.4. <code class="literal">ip::address_v6</code> members</h5></div></div></div><pre class="programlisting"><span class="keyword">void</span> <span class="identifier">scope_id</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">id</span><span class="special">)</span> <span class="identifier">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="identifier">constexpr</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">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="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_unspecified</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents an unspecified
              address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">3</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">4</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">5</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">6</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">7</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">8</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">9</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">10</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">11</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">12</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">13</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">14</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">15</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_loopback</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a loopback
              address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">3</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">4</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">5</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">6</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">7</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">8</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span> <span class="number">9</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">10</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">11</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span>
    <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">12</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">13</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">14</span><span class="special">]</span> <span class="special">==</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">b</span><span class="special">[</span><span class="number">15</span><span class="special">]</span> <span class="special">==</span> <span class="number">1</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_multicast</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              node-local address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x01</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              link-local address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x02</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              site-local address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x05</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">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
              organisation-local address, as if computed by the following method:
              
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x08</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> A boolean indicating whether the <code class="computeroutput"><span class="identifier">address_v6</span></code> object represents a multicast
              global address, as if computed by the following method: 
</p><pre class="programlisting"><span class="identifier">bytes_type</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">to_bytes</span><span class="special">();</span>
<span class="keyword">return</span> <span class="identifier">b</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">0xFF</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="identifier">b</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&amp;</span> <span class="number">0x0F</span><span class="special">)</span> <span class="special">==</span> <span class="number">0x0E</span><span class="special">;</span>
</pre><p>
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">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="6.1.2. network byte order">network byte order</a>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">to_string</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts an address into a string representation.
              If <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">0</span></code>,
              converts as if by <span class="emphasis"><em>POSIX</em></span> <a class="ulink" href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_ntop.html" target="_top"><code class="computeroutput"><span class="identifier">inet_ntop</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET6</span></code>.
              If <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">!=</span> <span class="number">0</span></code>,
              the format is <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span><code class="computeroutput"><span class="special">%</span></code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>,
              where <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              is the string representation of the equivalent address having <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">==</span> <span class="number">0</span></code>,
              and <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is an implementation-defined string representation of the scope identifier.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, the string representation
              of the address. Otherwise <code class="computeroutput"><span class="identifier">string</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.4.5. ip::address_v6 static members"><div class="titlepage"><div><div><h5 class="title"><a name="classes.__ip__address_v6__static_members"></a>6.3.4.5. <code class="literal">ip::address_v6</code> static members</h5></div></div></div><pre class="programlisting"><span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">any</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">static</span> <span class="identifier">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">loopback</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> An address <code class="computeroutput"><span class="identifier">a</span></code>
              such that the condition <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_loopback</span><span class="special">()</span></code> holds.
            </p></blockquote></div></div><div class="section" title="6.3.4.6. ip::address_v6 comparisons"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__comparisons"></a>6.3.4.6. <code class="literal">ip::address_v6</code> comparisons</h5></div></div></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">&amp;&amp;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">||</span> <span class="special">(!(</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">())</span> <span class="special">&amp;&amp;</span>
              <span class="identifier">a</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">()</span>
              <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">scope_id</span><span class="special">())</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">b</span>
              <span class="special">&lt;</span> <span class="identifier">a</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="special">!(</span><span class="identifier">b</span> <span class="special">&lt;</span>
              <span class="identifier">a</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span> <span class="identifier">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="6.3.4.7. ip::address_v6 creation"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__creation"></a>6.3.4.7. <code class="literal">ip::address_v6</code> creation</h5></div></div></div><pre class="programlisting"><span class="identifier">constexpr</span> <span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">::</span><span class="identifier">bytes_type</span><span class="special">&amp;</span> <span class="identifier">bytes</span><span class="special">,</span>
                                     <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">scope_id</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">(</span><span class="identifier">bytes</span><span class="special">,</span> <span class="identifier">scope_id</span><span class="special">)</span></code>.
            </p></blockquote></div><pre class="programlisting"><span class="identifier">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="identifier">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="identifier">noexcept</span><span class="special">;</span>
<span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">address_v6</span> <span class="identifier">make_address_v6</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&amp;</span> <span class="identifier">ec</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Converts a string representation of an
              address into a corresponding <code class="computeroutput"><span class="identifier">address_v6</span></code>
              value. The format is either <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              or <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span><code class="computeroutput"><span class="special">%</span></code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>,
              where <span class="emphasis"><em><code class="computeroutput"><span class="identifier">address</span></code></em></span>
              is in the format specified by <span class="emphasis"><em>POSIX</em></span> <a class="ulink" href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_pton.html" target="_top"><code class="computeroutput"><span class="identifier">inet_pton</span><span class="special">()</span></code></a>
              when invoked with address family <code class="computeroutput"><span class="identifier">AF_INET6</span></code>,
              and <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is an optional string specifying the scope identifier. All implementations
              shall accept as <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              a string representation of an unsigned decimal integer. It is implementation-defined
              whether alternative scope identifier representations are permitted.
              If <span class="emphasis"><em><code class="computeroutput"><span class="identifier">scope</span><span class="special">-</span><span class="identifier">id</span></code></em></span>
              is not supplied, an <code class="computeroutput"><span class="identifier">address_v6</span></code>
              object shall be returned such that <code class="computeroutput"><span class="identifier">scope_id</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span></code>.
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> If successful, an <code class="computeroutput"><span class="identifier">address_v6</span></code>
              value corresponding to the string <code class="computeroutput"><span class="identifier">str</span></code>.
              Otherwise returns <code class="computeroutput"><span class="identifier">address_v6</span><span class="special">()</span></code>.
            </p></blockquote></div></div><div class="section" title="6.3.4.8. ip::address_v6 I/O"><div class="titlepage"><div><div><h5 class="title"><a name="classes.ip__address_v6__io"></a>6.3.4.8. <code class="literal">ip::address_v6</code> I/O</h5></div></div></div><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
  <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span>
    <span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">address_v6</span><span class="special">&amp;</span> <span class="identifier">addr</span><span class="special">);</span>
</pre><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Effects:</em></span> Outputs the string representation of
              the address to the stream, as if it were implemented as follows: 
</p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">string</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">addr</span><span class="special">.</span><span class="identifier">to_string</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">exceptions</span><span class="special">()</span> <span class="special">&amp;</span> <span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">)</span>
    <span class="keyword">throw</span> <span class="identifier">system_error</span><span class="special">(</span><span class="identifier">ec</span><span class="special">);</span>
  <span class="keyword">else</span>
    <span class="identifier">os</span><span class="special">.</span><span class="identifier">setstate</span><span class="special">(</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">failbit</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">else</span>
  <span class="keyword">for</span> <span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
    <span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
</pre><p>
            </p></blockquote></div><div class="blockquote"><blockquote class="blockquote"><p>
              <span class="emphasis"><em>Returns:</em></span> <code class="computeroutput"><span class="identifier">os</span></code>.
            </p></blockquote></div></div></div><div class="section" title="6.3.5. Class ip::bad_address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="classes.ip__bad_address_cast"></a>6.3.5. Class <code class="literal">ip::bad_address_cast</code></h4></div></div></div><pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span>
  <span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
    <span class="keyword">namespace</span> <span class="identifier">net</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">bad_address_cast</span> <span class="special">:</span> <span class="identifier">bad_cast</span>
        <span class="special">{</span>
        <span class="keyword">public</span><span class="special">:</span>
          <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span>
        <span class="special">};</span>

      <span class="special">}</span> <span class="comment">// namespace ip</span>
    <span class="special">}</span> <span class="comment">// namespace net</span>
  <span class="special">}</span> <span class="comment">// namespace experimental</span>
<span class="special">}</span> <span class="comment">// namespace std</span>
</pre><p>
          Objects of type <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
          are thrown by a failed <code class="computeroutput"><span class="identifier">address_cast</span></code>.
        </p></div><div class="section" title="6.3.6. Function ip::address_cast"><div class="titlepage"><div><div><h4 class="title"><a name="functions.ip__address_cast"></a>6.3.6. Function <code class="literal">ip::address_cast</code></h4></div></div></div><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">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="identifier">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="idm438315877984"></a><p class="title"><b>Table 4. template &lt;class T&gt; constexpr T address_cast(const address&amp;)
          effects</b></p><div class="table-contents"><table summary="template &lt;class T&gt; constexpr T address_cast(const address&amp;)
          effects" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>
                  <p>
                    T
                  </p>
                </th><th>
                  <p>
                    noexcept
                  </p>
                </th><th>
                  <p>
                    remarks
                  </p>
                </th></tr></thead><tbody><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">true</span></code>
                  </p>
                </td><td>
                  <p>
                    Returns <code class="computeroutput"><span class="identifier">a</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v4</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">false</span></code>
                  </p>
                </td><td>
                  <p>
                    If <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v4</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, returns
                    the IP version 4 address specified in the version-independent
                    address object <code class="computeroutput"><span class="identifier">a</span></code>.
                    Otherwise, throws <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>.
                  </p>
                </td></tr><tr><td>
                  <p>
                    <code class="computeroutput"><span class="identifier">address_v6</span></code>
                  </p>
                </td><td>
                  <p>
                    <code class="computeroutput"><span class="keyword">false</span></code>
                  </p>
                </td><td>
                  <p>
                    If <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">is_v6</span><span class="special">()</span></code>
                    is <code class="computeroutput"><span class="keyword">true</span></code>, returns
                    the IP version 6 address specified in the version-independent
                    address object <code class="computeroutput"><span class="identifier">a</span></code>.
                    Otherwise, throws <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>.
                  </p>
                </td></tr></tbody></table></div></div><br class="table-break"><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">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="identifier">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="idm438315831808"></a><p class="title"><b>Table 5. template &lt;class T&gt; constexpr T address_cast(const address_v4&amp;)
          effects</b></p><div class="table-contents"><table summary="template &lt;class T&gt; constexpr T address_cast(const address_v4&amp;)
          effects" border="1"><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="identifier">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="identifier">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="idm438315784688"></a><p class="title"><b>Table 6. template &lt;class T&gt; constexpr T address_cast(const address_v6&amp;)
          effects</b></p><div class="table-contents"><table summary="template &lt;class T&gt; constexpr T address_cast(const address_v6&amp;)
          effects" border="1"><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="6.3.7. Hash support"><div class="titlepage"><div><div><h4 class="title"><a name="classes.hash"></a>6.3.7. Hash support</h4></div></div></div><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">net</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">net</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">net</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>
</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++14 [unord.hash]).
          </p></blockquote></div></div><div class="section" title="6.3.8. Suffixes for address literals"><div class="titlepage"><div><div><h4 class="title"><a name="functions.literals"></a>6.3.8. Suffixes for address literals</h4></div></div></div><p>
          This section describes literal suffixes for constructing address literals.
          The suffixes <code class="computeroutput"><span class="identifier">ip</span></code>, <code class="computeroutput"><span class="identifier">ipv4</span></code> and <code class="computeroutput"><span class="identifier">ipv6</span></code>
          denote address values of the corresponding types <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span></code>,
          <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span></code> and <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span></code>
          respectively if they are applied to string literals.
        </p><p>
          [<span class="emphasis"><em>Example:</em></span> The following code shows some address literals.
        </p><p>
          
</p><pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">net_literals</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">addr</span> <span class="special">=</span> <span class="string">"127.0.0.1"</span><span class="identifier">ip</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">v4_addr</span> <span class="special">=</span> <span class="string">"255.255.255.255"</span><span class="identifier">ipv4</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">v6_addr</span> <span class="special">=</span> <span class="string">"::1"</span><span class="identifier">ipv6</span><span class="special">;</span>
</pre><p>
        </p><p>
          &#8212;<span class="emphasis"><em>end example</em></span>]
        </p><pre class="programlisting"><span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ip</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">size_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">net</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="identifier">str</span><span class="special">)</span></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ipv4</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">size_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">net</span><span class="special">::</span><span class="identifier">ip</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></code>.
          </p></blockquote></div><pre class="programlisting"><span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v6</span> <span class="keyword">operator</span> <span class="string">""</span> <span class="identifier">ipv6</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">size_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">net</span><span class="special">::</span><span class="identifier">ip</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></code>.
          </p></blockquote></div></div></div></div><div class="section" title="7. Changes in This Revision"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.changes"></a>7. Changes in This Revision</h2></div></div></div><p>
      In this revision of the proposal, we include changes made based on feedback
      and discussion from the 2013 meeting of SG4 at Bristol, where N3603 was discussed.
    </p><div class="section" title="7.1. Namespace"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.namespace"></a>7.1. Namespace</h3></div></div></div><p>
        This revision moves the proposed types and functions from the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span></code> namespace
        to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span></code>.
      </p></div><div class="section" title="7.2. A Version-Independent Vocabulary Type"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.a_version_independent_vocabulary_type"></a>7.2. A Version-Independent Vocabulary Type</h3></div></div></div><p>
        The <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span></code> class has been modified so that
        the version-specific types do not appear in its interface. An approach based
        on the <code class="computeroutput"><span class="identifier">any</span></code> class has been
        adopted (see Library Fundamentals working draft), and address types may be
        explicitly converted using the <code class="computeroutput"><span class="identifier">address_cast</span><span class="special">&lt;&gt;</span></code> function. The version-specific types
        are implicitly convertible to <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address</span></code>
        via a template constructor.
      </p><p>
        For example:
      </p><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">a</span><span class="special">;</span>
<span class="identifier">address</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span> <span class="comment">// ok, implicit conversion</span>
<span class="identifier">address</span> <span class="identifier">c</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">a</span><span class="special">);</span> <span class="comment">// ok, explicit conversion</span>
<span class="identifier">address_v4</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v4</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">);</span> <span class="comment">// ok, explicit conversion</span>
<span class="identifier">address_v6</span> <span class="identifier">e</span> <span class="special">=</span> <span class="identifier">address_cast</span><span class="special">&lt;</span><span class="identifier">address_v6</span><span class="special">&gt;(</span><span class="identifier">b</span><span class="special">);</span> <span class="comment">// invalid, throws bad_address_cast</span>
</pre></div><div class="section" title="7.3. Use of noexcept"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.use_of_noexcept"></a>7.3. Use of noexcept</h3></div></div></div><p>
        Many functions have now been marked <code class="computeroutput"><span class="identifier">noexcept</span></code>.
      </p></div><div class="section" title="7.4. Explicit Creation from Strings"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.explicit_creation_from_strings"></a>7.4. Explicit Creation from Strings</h3></div></div></div><p>
        This replaces the <code class="computeroutput"><span class="identifier">from_string</span><span class="special">()</span></code> static member functions with new free functions
        <code class="computeroutput"><span class="identifier">make_address</span><span class="special">()</span></code>,
        <code class="computeroutput"><span class="identifier">make_address_v4</span><span class="special">()</span></code>
        and <code class="computeroutput"><span class="identifier">make_address_v6</span><span class="special">()</span></code>.
        These functions allow explicit creation of the address types from strings
        and other types, such as an array of bytes or an integer in host byte order.
        For example, one overload throws an exception on failure:
      </p><pre class="programlisting"><span class="identifier">address_v4</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"127.0.0.1"</span><span class="special">);</span> <span class="comment">// succeeds</span>
<span class="identifier">address_v4</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"::1"</span><span class="special">);</span> <span class="comment">// throws</span>
</pre><p>
        and another overload provides a non-throwing alternative:
      </p><pre class="programlisting"><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
<span class="identifier">address_v4</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"127.0.0.1"</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span> <span class="comment">// succeeds, clears ec</span>
<span class="identifier">address_v4</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">make_address_v4</span><span class="special">(</span><span class="string">"::1"</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span> <span class="comment">// sets ec</span>
</pre><p>
        An explicit template constructor has been added to also support this style
        of use:
      </p><pre class="programlisting"><span class="identifier">address</span> <span class="identifier">c</span><span class="special">(</span><span class="string">"127.0.0.1"</span><span class="special">);</span>
</pre><p>
        This constructor simply forwards the arguments to the appropriate <code class="computeroutput"><span class="identifier">make_address</span><span class="special">()</span></code>
        overload.
      </p></div><div class="section" title="7.5. String Literals"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.string_literals"></a>7.5. String Literals</h3></div></div></div><p>
        Support for IP address literals has been included. For example:
      </p><pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">experimental</span><span class="special">::</span><span class="identifier">net_literals</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">addr</span> <span class="special">=</span> <span class="string">"127.0.0.1"</span><span class="identifier">ip</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">v4_addr</span> <span class="special">=</span> <span class="string">"255.255.255.255"</span><span class="identifier">ipv4</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">v6_addr</span> <span class="special">=</span> <span class="string">"::1"</span><span class="identifier">ipv6</span><span class="special">;</span>
</pre></div><div class="section" title="7.6. Strongly-Typed Byte Representations"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.bytes_type"></a>7.6. Strongly-Typed Byte Representations</h3></div></div></div><p>
        The nested typedefs <code class="computeroutput"><span class="identifier">bytes_type</span></code>
        have been changed to be unique standard-layout types. Objects of type <code class="computeroutput"><span class="identifier">bytes_type</span></code> are implicitly convertible to
        the corresponding address class. This is intended to support the following
        use case, where the byte representations of addresses are included as part
        of a larger standard-layout structure, such as a packet definition:
      </p><pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">header</span>
<span class="special">{</span>
  <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="identifier">from</span><span class="special">;</span>
  <span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">bytes_type</span> <span class="identifier">to</span><span class="special">;</span>
  <span class="comment">// ...</span>
<span class="special">};</span>

<span class="keyword">struct</span> <span class="identifier">message</span>
<span class="special">{</span>
  <span class="identifier">header</span> <span class="identifier">hdr</span><span class="special">;</span>
  <span class="comment">// ...</span>
<span class="special">};</span>

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

<span class="identifier">address_v4</span> <span class="identifier">old_address</span> <span class="special">=</span> <span class="string">"1.2.3.4"</span><span class="identifier">ipv4</span><span class="special">;</span>
<span class="identifier">address_v4</span> <span class="identifier">new_address</span> <span class="special">=</span> <span class="string">"4.3.2.1"</span><span class="identifier">ipv4</span><span class="special">;</span>

<span class="identifier">message</span> <span class="identifier">m</span><span class="special">;</span>
<span class="identifier">receive_message</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> <span class="comment">// e.g. reads bytes from a socket</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">m</span><span class="special">.</span><span class="identifier">hdr</span><span class="special">.</span><span class="identifier">to</span> <span class="special">==</span> <span class="identifier">old_address</span><span class="special">)</span>
  <span class="identifier">m</span><span class="special">.</span><span class="identifier">hdr</span><span class="special">.</span><span class="identifier">to</span> <span class="special">=</span> <span class="identifier">new_address</span><span class="special">.</span><span class="identifier">to_bytes</span><span class="special">();</span>
</pre></div><div class="section" title="7.7. Use of constexpr"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.use_of_constexpr"></a>7.7. Use of constexpr</h3></div></div></div><p>
        The <code class="computeroutput"><span class="identifier">constexpr</span></code> keyword has
        been applied to some of the functions in the proposal. The rationale for
        this change is that many of the equivalent <span class="emphasis"><em>POSIX</em></span> macros
        can be used in constant expressions.
      </p></div><div class="section" title="7.8. Make Default-Constructed address Invalid"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.make_default_constructed_address_invalid"></a>7.8. Make Default-Constructed address Invalid</h3></div></div></div><p>
        A default-constructed <code class="computeroutput"><span class="identifier">address</span></code>
        object now represents an invalid address that is neither IPv4 nor IPv6. Any
        attempt to <code class="computeroutput"><span class="identifier">address_cast</span></code> it
        to another type will result in a <code class="computeroutput"><span class="identifier">bad_address_cast</span></code>
        exception.
      </p></div><div class="section" title="7.9. Removed address_v4::netmask"><div class="titlepage"><div><div><h3 class="title"><a name="ipaddress.removed_address_v4__netmask"></a>7.9. Removed address_v4::netmask</h3></div></div></div><p>
        The <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">address_v4</span><span class="special">::</span><span class="identifier">netmask</span></code> function has been removed as it
        is not possible to give the correct answer, given only an arbitrary IP address,
        without access to the routing table.
      </p></div></div><div class="section" title="8. Acknowledgements"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.acknowledgements"></a>8. Acknowledgements</h2></div></div></div><p>
      The author would like to thank Arash Partow, Jamie Allsop, James Anderson and
      Kyle Kloepper for their feedback and suggestions.
    </p></div><div class="section" title="9. References"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ipaddress.references"></a>9. References</h2></div></div></div><p>
      <a name="ref-RFC4291"></a>[RFC4291] Hinden, R. and Deering, S., <span class="emphasis"><em>RFC
      4291: Internet Protocol Version 6 (IPv6) Addressing Architecture</em></span>,
      2006, <a class="ulink" href="http://www.ietf.org/rfc/rfc4291.txt" target="_top">http://www.ietf.org/rfc/rfc4291.txt</a>.
    </p></div></div></body></html>
