<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
<title>Wording for range-based for-loop (revision 4)</title>
<meta name="author" content="Thorsten Ottosen" />
<meta name="date" content="2008-09-18" />
<style type="text/css">

/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: n2778.html,v 1.1 2008/09/19 16:27:20 wg21 Exp nobody $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin: 0 0 0.5em 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left {
  clear: left }

img.align-right {
  clear: right }

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font-family: serif ;
  font-size: 100% }

pre.literal-block, pre.doctest-block {
  margin-left: 2em ;
  margin-right: 2em }

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document" id="wording-for-range-based-for-loop-revision-4">
<h1 class="title">Wording for range-based for-loop (revision 4)</h1>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
<tbody valign="top">
<tr><th class="docinfo-name">Author:</th>
<td>Thorsten Ottosen</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:nesotto&#64;cs.aau.dk">nesotto&#64;cs.aau.dk</a></td></tr>
<tr class="field"><th class="docinfo-name">Advisor:</th><td class="field-body">Lawrence Crowl, Douglas Gregor and Jens Maurer</td>
</tr>
<tr class="field"><th class="docinfo-name">Organizations:</th><td class="field-body"><a class="reference external" href="http://www.cs.aau.dk">Department of Computer Science, Aalborg University</a></td>
</tr>
<tr><th class="docinfo-name">Date:</th>
<td>2008-09-18</td></tr>
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">WG21/N2778 and J16/08-0288</td>
</tr>
<tr class="field"><th class="docinfo-name">Working Group:</th><td class="field-body">Core</td>
</tr>
</tbody>
</table>
<div class="abstract topic">
<p class="topic-title first">Abstract</p>
<p>This paper provides wording for the new range-based for-loop
previously described in <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1868.html">n1868</a>, <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n1961.html">n1961</a>, <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2049.pdf">n2049</a>, <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/n2196.html">n2196</a> ,
<a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2243.html">n2243</a> and <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/n2394.html">n2394</a>.</p>
</div>
<!-- ######################### -->
<!-- # Roles -->
<!-- ######################### -->
<div class="contents topic" id="table-of-contents">
<p class="topic-title first">Table of Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#introduction" id="id2">Introduction</a></li>
<li><a class="reference internal" href="#missing-parts" id="id3">Missing parts</a></li>
<li><a class="reference internal" href="#wording" id="id4">Wording</a><ul>
<li><a class="reference internal" href="#local-scope" id="id5">3.3.2 Local scope</a></li>
<li><a class="reference internal" href="#iteration-statements" id="id6">6.5 Iteration statements</a></li>
<li><a class="reference internal" href="#the-range-based-for-statement" id="id7">6.5.4 The range-based <tt class="docutils literal"><span class="pre">for</span></tt> statement</a></li>
<li><a class="reference internal" href="#auto-specifier" id="id8">7.1.6.4 <tt class="docutils literal"><span class="pre">auto</span></tt> specifier</a></li>
<li><a class="reference internal" href="#iterator-concepts-iterator-concepts" id="id9">24.1 Iterator concepts [iterator.concepts]</a></li>
<li><a class="reference internal" href="#ranges-iterator-concepts-range" id="id10">24.1.6 Ranges [iterator.concepts.range]</a></li>
<li><a class="reference internal" href="#header-initializer-list" id="id11">18.8 Header <tt class="docutils literal"><span class="pre">&lt;initializer_list&gt;</span></tt></a></li>
<li><a class="reference internal" href="#initializer-list-concept-maps" id="id12">18.8.1 Initializer list concept maps</a></li>
<li><a class="reference internal" href="#header-utility-synopsis" id="id13">20.2 Header <tt class="docutils literal"><span class="pre">&lt;utility&gt;</span></tt> synopsis</a></li>
<li><a class="reference internal" href="#pair-concept-maps" id="id14">20.2.3 pair concept maps</a></li>
<li><a class="reference internal" href="#header-tuple-synopsis" id="id15">20.3 Header <tt class="docutils literal"><span class="pre">&lt;tuple&gt;</span></tt> synopsis</a></li>
<li><a class="reference internal" href="#tuple-concept-maps" id="id16">20.3.1.6 tuple concept maps</a></li>
<li><a class="reference internal" href="#container-concepts-container-concepts" id="id17">23.1.4 Container concepts [container.concepts]</a></li>
<li><a class="reference internal" href="#container-concept-maps-container-concepts-member" id="id18">23.1.4.3 Container concept maps [container.concepts.member]</a></li>
<li><a class="reference internal" href="#header-valarray-synopsis" id="id19">26.5.1 Header <tt class="docutils literal"><span class="pre">&lt;valarray&gt;</span></tt> synopsis</a></li>
<li><a class="reference internal" href="#valarray-concept-maps" id="id20">26.5.2.7 valarray concept maps</a></li>
<li><a class="reference internal" href="#header-regex-synopsis" id="id21">28.4 Header <tt class="docutils literal"><span class="pre">&lt;regex&gt;</span></tt> synopsis</a></li>
<li><a class="reference internal" href="#sub-match-concept-maps" id="id22">28.9.3 sub_match concept maps</a></li>
</ul>
</li>
</ul>
</div>
<!-- section-numbering: -->
<div class="section" id="introduction">
<h1><a class="toc-backref" href="#id2">Introduction</a></h1>
<p>This document provides wording for a concept-based implementation
of the range-based for loop. The proposal is
implemented in the latest version of Douglas Gregors <a class="reference external" href="http://www.generic-programming.org/software/ConceptGCC/">Concept GCC</a>.</p>
<p>Each numbered section below describes a new section
for the standard or modifications to an existing section.
Comments are written in <strong>bold</strong> up front and are not part of the wording.</p>
<p>The author would like to thank Lawrence Crowl, Steve Adamczyk and Douglas Gregor for their help with
the first revisions. Special thanks goes to Jens Maurer for his help with this revision.
Any mistake
is the responsibility of the author.</p>
</div>
<div class="section" id="missing-parts">
<h1><a class="toc-backref" href="#id3">Missing parts</a></h1>
<p>The layout of concept headers is not yet finalized. This will only
affect the library wording in minor ways and so the wording is included
with any reference to the exact section in the standard.</p>
</div>
<div class="section" id="wording">
<h1><a class="toc-backref" href="#id4">Wording</a></h1>
<div class="section" id="local-scope">
<h2><a class="toc-backref" href="#id5">3.3.2 Local scope</a></h2>
<p><strong>Modify paragraph 4 as indicated</strong>:</p>
<!-- parsed-literal: -->
<p>Names declared in the <em>for-init-statement</em>, <span class="html"><b>the <i>for-range-declaration</i></b></span>, and
in the condition of if, while, for, and switch statements are local to the
if, while, for, or switch statement (including the controlled statement),
and shall not be redeclared in a subsequent condition of that statement
nor in the outermost block (or, for the if statement, any of the outermost
blocks) of the controlled statement; see 6.4 stmt.select.</p>
</div>
<div class="section" id="iteration-statements">
<h2><a class="toc-backref" href="#id6">6.5 Iteration statements</a></h2>
<p><strong>Modify paragraph 1 as indicated</strong>:</p>
<pre class="literal-block">
iteration-statement:
        while ( condition ) statement
        do statement while ( expression ) ;
        for ( for-init-statement condition<sub>opt</sub> ; expression<sub>opt</sub> ) statement
        <strong>for ( for-range-declaration : expression ) statement</strong>

for-init-statement:
        expression-statement
        simple-declaration

<strong>for-range-declaration:</strong>
        <strong>type-specifier-seq attribute-specifier</strong><sub>opt</sub> <strong>declarator</strong>
</pre>
<p><strong>Editorial note: if the attribute paper is not passed, remove the attribute-specifier above.</strong></p>
</div>
<div class="section" id="the-range-based-for-statement">
<h2><a class="toc-backref" href="#id7">6.5.4 The range-based <tt class="docutils literal"><span class="pre">for</span></tt> statement</a></h2>
<p><strong>Add the following new section</strong>:</p>
<p>1 The range-based <tt class="docutils literal"><span class="pre">for</span></tt> statement</p>
<pre class="literal-block">
for ( <em>for-range-declaration</em> : <em>expression</em> ) <em>statement</em>
</pre>
<p>is equivalent to</p>
<pre class="literal-block">
{
     auto &amp;&amp; __range = ( <em>expression</em> );

     for ( auto __begin = std::Range&lt;_RangeT&gt;::begin(__range),
                  __end = std::Range&lt;_RangeT&gt;::end(__range);
          __begin != __end;
          ++__begin )
     {
         <em>for-range-declaration</em> = *__begin;
         <em>statement</em>
     }
}
</pre>
<p>where <tt class="docutils literal"><span class="pre">__range</span></tt>, <tt class="docutils literal"><span class="pre">__begin</span></tt> and <tt class="docutils literal"><span class="pre">__end</span></tt> are variables defined for exposition only, and <tt class="docutils literal"><span class="pre">_RangeT</span></tt> is the type of the <em>expression</em>.</p>
<p>[<em>Example:</em></p>
<pre class="literal-block">
int array[5] =  { 1,2,3,4,5 };
for ( int&amp; x : array )
  x *= 2;
</pre>
<p>-- <em>end example</em>]</p>
<p>2 If the header <tt class="docutils literal"><span class="pre">&lt;iterator_concepts&gt;</span></tt> (24.1) is not included prior to a use of the range-based <tt class="docutils literal"><span class="pre">for</span></tt> statement, the program is ill-formed.</p>
</div>
<div class="section" id="auto-specifier">
<h2><a class="toc-backref" href="#id8">7.1.6.4 <tt class="docutils literal"><span class="pre">auto</span></tt> specifier</a></h2>
<p><strong>Modify paragraph 4 as indicated</strong>:</p>
<p>4 The auto type-specifier can also be used in declaring an object in the condition of a selection statement (6.4)
or an iteration statement (6.5), in the type-specifier-seq in a new-type-id (5.3.4), <em>in a for-range-declaration,</em> and in declaring a static data
member with a constant-initializer that appears within the member-specification of a class definition (9.4.2).</p>
</div>
<div class="section" id="iterator-concepts-iterator-concepts">
<h2><a class="toc-backref" href="#id9">24.1 Iterator concepts [iterator.concepts]</a></h2>
<p><strong>Add the following to the synopsis for header ``&lt;iterator_concepts&gt;``</strong>:</p>
<pre class="literal-block">
concept Range&lt; typename T &gt; <em>see below</em>;

template&lt; class T, size_t N &gt;
concept_map Range&lt; T[N] &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section to [iterator.concepts]</strong>:</p>
</div>
<div class="section" id="ranges-iterator-concepts-range">
<h2><a class="toc-backref" href="#id10">24.1.6 Ranges [iterator.concepts.range]</a></h2>
<p>1 A type T satisfies the requirements of a range if it meets the syntactic and semantic requirements of the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
<pre class="literal-block">
concept Range&lt; typename T &gt; {
    InputIterator iterator;
    iterator begin( T&amp; );
    iterator end( T&amp; );
}
</pre>
<p>2 <em>Note</em>: Any object of a type conforming to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept can be used with the range-based <tt class="docutils literal"><span class="pre">for</span></tt> statement (6.5.4).</p>
<p>3 <em>Requires</em>: For an object <tt class="docutils literal"><span class="pre">t</span></tt> of a type <tt class="docutils literal"><span class="pre">T</span></tt> conforming to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept,
<tt class="docutils literal"><span class="pre">[Range&lt;T&gt;::begin(t),Range&lt;T&gt;::end(t))</span></tt> shall designate a valid range (24.1.7).</p>
<pre class="literal-block">
template&lt; class T, size_t N &gt;
concept_map Range&lt; T[N] &gt;
{
    typedef T* iterator;
    iterator begin( T(&amp;a)[N] ) { return a; }
    iterator end( T(&amp;a)[N] )   { return a + N; }
};
</pre>
<p>4 <em>Note</em>: Adapts an array to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
</div>
<div class="section" id="header-initializer-list">
<h2><a class="toc-backref" href="#id11">18.8 Header <tt class="docutils literal"><span class="pre">&lt;initializer_list&gt;</span></tt></a></h2>
<p><strong>Add the following to the synopsis</strong>:</p>
<pre class="literal-block">
template&lt;typename T&gt;
concept_map Range&lt; initializer_list&lt;T&gt; &gt; <em>see below</em>;

template&lt;typename T&gt;
concept_map Range&lt; const initializer_list&lt;T&gt; &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section that describes &lt;initializer_list&gt;</strong>:</p>
</div>
<div class="section" id="initializer-list-concept-maps">
<h2><a class="toc-backref" href="#id12">18.8.1 Initializer list concept maps</a></h2>
<pre class="literal-block">
template&lt;typename T&gt;
concept_map Range&lt; initializer_list&lt;T&gt; &gt;
{
    typedef const T* iterator;

    iterator begin( initializer_list&lt;T&gt; r ) { return r.begin(); }
    iterator end( initializer_list&lt;T&gt; r )   { return r.end(); }
}

template&lt;typename T&gt;
concept_map Range&lt; const initializer_list&lt;T&gt; &gt;
{
    typedef const T* iterator;

    iterator begin( initializer_list&lt;T&gt; r ) { return r.begin(); }
    iterator end( initializer_list&lt;T&gt; r )   { return r.end(); }
}
</pre>
<p>1 <em>Note</em>: Adapts initializer lists to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
</div>
<div class="section" id="header-utility-synopsis">
<h2><a class="toc-backref" href="#id13">20.2 Header <tt class="docutils literal"><span class="pre">&lt;utility&gt;</span></tt> synopsis</a></h2>
<p><strong>Add the following to the synopsis</strong>:</p>
<pre class="literal-block">
template&lt;InputIterator Iter&gt;
concept_map Range&lt; pair&lt;Iter,Iter&gt; &gt; <em>see below</em>;

template&lt;InputIterator Iter&gt;
concept_map Range&lt; const pair&lt;Iter,Iter&gt; &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section</strong>:</p>
</div>
<div class="section" id="pair-concept-maps">
<h2><a class="toc-backref" href="#id14">20.2.3 pair concept maps</a></h2>
<pre class="literal-block">
template&lt;InputIterator Iter&gt;
concept_map Range&lt; pair&lt;Iter,Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( pair&lt;Iter,Iter&gt;&amp; p ) { return p.first; }
    Iter end( pair&lt;Iter,Iter&gt;&amp; p )   { return p.second; }
};

template&lt;InputIterator Iter&gt;
concept_map Range&lt; const pair&lt;Iter,Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( const pair&lt;Iter,Iter&gt;&amp; p ) { return p.first; }
    Iter end( const pair&lt;Iter,Iter&gt;&amp; p )   { return p.second; }
};
</pre>
<p>1 <em>Note</em>: Adapts a <tt class="docutils literal"><span class="pre">pair</span></tt> object of two iterators to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
</div>
<div class="section" id="header-tuple-synopsis">
<h2><a class="toc-backref" href="#id15">20.3 Header <tt class="docutils literal"><span class="pre">&lt;tuple&gt;</span></tt> synopsis</a></h2>
<p><strong>Add the following to the synopsis</strong>:</p>
<pre class="literal-block">
template&lt;InputIterator Iter&gt;
concept_map Range&lt; tuple&lt;Iter,Iter&gt; &gt; <em>see below</em>;

template&lt;InputIterator Iter&gt;
concept_map Range&lt; const tuple&lt;Iter,Iter&gt; &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section</strong>:</p>
</div>
<div class="section" id="tuple-concept-maps">
<h2><a class="toc-backref" href="#id16">20.3.1.6 tuple concept maps</a></h2>
<pre class="literal-block">
template&lt;InputIterator Iter&gt;
concept_map Range&lt; tuple&lt;Iter,Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( tuple&lt;Iter,Iter&gt;&amp; p ) { return std::get&lt;0&gt;(p); }
    Iter end( tuple&lt;Iter,Iter&gt;&amp; p )   { return std::get&lt;1&gt;(p); }
};

template&lt;InputIterator Iter&gt;
concept_map Range&lt; const tuple&lt;Iter,Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( const tuple&lt;Iter,Iter&gt;&amp; p ) { return std::get&lt;0&gt;(p); }
    Iter end( const tuple&lt;Iter,Iter&gt;&amp; p )   { return std::get&lt;1&gt;(p); }
};
</pre>
<p>1 <em>Note</em>: Adapts a <tt class="docutils literal"><span class="pre">tuple</span></tt> object of two iterators to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
</div>
<div class="section" id="container-concepts-container-concepts">
<h2><a class="toc-backref" href="#id17">23.1.4 Container concepts [container.concepts]</a></h2>
<p><strong>Add the following to the end of the ``&lt;container_concepts&gt;'' synopsis</strong>:</p>
<pre class="literal-block">
template&lt;Container C&gt;
concept_map Range&lt;C&gt; <em>see below</em>;

template&lt;Container C&gt;
concept_map Range&lt;const C&gt; <em>see below</em>;
</pre>
</div>
<div class="section" id="container-concept-maps-container-concepts-member">
<h2><a class="toc-backref" href="#id18">23.1.4.3 Container concept maps [container.concepts.member]</a></h2>
<p><strong>Add the following to the end of [container.concepts.member]</strong>:</p>
<pre class="literal-block">
template&lt;Container C&gt;
concept_map Range&lt;C&gt;
{
    typedef C::iterator iterator;
    iterator begin( C&amp; c ) { return Container&lt;C&gt;::begin(c); }
    iterator end( C&amp; c )   { return Container&lt;C&gt;::end(c); }
};

template&lt;Container C&gt;
concept_map Range&lt;const C&gt;
{
    typedef C::const_iterator iterator;
    iterator begin( const C&amp; c ) { return Container&lt;C&gt;::begin(c); }
    iterator end( const C&amp; c )   { return Container&lt;C&gt;::end(c); }
};
</pre>
<p>13 <em>Note</em>: Adapts any type that meets the requirements of the <tt class="docutils literal"><span class="pre">Container</span></tt> concept to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
</div>
<div class="section" id="header-valarray-synopsis">
<h2><a class="toc-backref" href="#id19">26.5.1 Header <tt class="docutils literal"><span class="pre">&lt;valarray&gt;</span></tt> synopsis</a></h2>
<p><strong>Add the following to the synopsis</strong>:</p>
<pre class="literal-block">
template&lt;class T&gt;
concept_map Range&lt; valarray&lt;T&gt; &gt; <em>see below</em>;

template&lt;class T&gt;
concept_map Range&lt; const valarray&lt;T&gt; &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section</strong>:</p>
</div>
<div class="section" id="valarray-concept-maps">
<h2><a class="toc-backref" href="#id20">26.5.2.7 valarray concept maps</a></h2>
<pre class="literal-block">
template&lt;class T&gt;
concept_map Range&lt; valarray&lt;T&gt; &gt;
{
    typedef <em>unspecified type</em> iterator;
    iterator begin( valarray&lt;T&gt;&amp; a );
    iterator end( valarray&lt;T&gt;&amp; a );
};
</pre>
<p>1 <em>Note</em> Adapts <tt class="docutils literal"><span class="pre">valarray</span></tt> to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">typedef</span></tt> <em>unspecified type</em> <tt class="docutils literal"><span class="pre">iterator;</span></tt></li>
</ul>
<p>2 <em>Requires</em>: <tt class="docutils literal"><span class="pre">iterator</span></tt> shall meet the requirements of the
<tt class="docutils literal"><span class="pre">RandomAccessIterator</span></tt> concept and <tt class="docutils literal"><span class="pre">iterator::reference</span></tt> shall equal <tt class="docutils literal"><span class="pre">T&amp;</span></tt>.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">begin(</span> <span class="pre">valarray&lt;T&gt;&amp;</span> <span class="pre">a</span> <span class="pre">);</span></tt></li>
</ul>
<p>3 <em>Returns</em>: an iterator referencing the first value in the numeric array.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">end(</span> <span class="pre">valarray&lt;T&gt;&amp;</span> <span class="pre">a</span> <span class="pre">);</span></tt></li>
</ul>
<p>4 <em>Returns</em>: an iterator one past the last value in the numeric array.</p>
<pre class="literal-block">
template&lt;class T&gt;
concept_map Range&lt; const valarray&lt;T&gt; &gt;
{
    typedef <em>unspecified type</em> iterator;
    iterator begin( const valarray&lt;T&gt;&amp; a );
    iterator end( const valarray&lt;T&gt;&amp; a );
};
</pre>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">typedef</span></tt> <em>unspecified type</em> <tt class="docutils literal"><span class="pre">iterator;</span></tt></li>
</ul>
<p>5 <em>Requires</em>: <tt class="docutils literal"><span class="pre">iterator</span></tt> shall meet the requirements of the <tt class="docutils literal"><span class="pre">RandomAccessIterator</span></tt> and <tt class="docutils literal"><span class="pre">iterator::reference</span></tt> shall equal <tt class="docutils literal"><span class="pre">const</span> <span class="pre">T&amp;</span></tt>.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">begin(</span> <span class="pre">const</span> <span class="pre">valarray&lt;T&gt;&amp;</span> <span class="pre">a</span> <span class="pre">);</span></tt></li>
</ul>
<p>6 <em>Returns</em>: an iterator referencing the first value in the numeric array.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">end(</span> <span class="pre">const</span> <span class="pre">valarray&lt;T&gt;&amp;</span> <span class="pre">a</span> <span class="pre">);</span></tt></li>
</ul>
<p>7 <em>Returns</em>: an iterator one past the last value in the numeric array.</p>
</div>
<div class="section" id="header-regex-synopsis">
<h2><a class="toc-backref" href="#id21">28.4 Header <tt class="docutils literal"><span class="pre">&lt;regex&gt;</span></tt> synopsis</a></h2>
<p><strong>Add the following to the synopsis</strong>:</p>
<pre class="literal-block">
&lt;BidirectionalIterator Iter&gt;
concept_map Range&lt; sub_match&lt;Iter&gt; &gt; <em>see below</em>;

template&lt;BidirectionalIterator Iter&gt;
concept_map Range&lt; const sub_match&lt;Iter&gt; &gt; <em>see below</em>;
</pre>
<p><strong>Add the following new section</strong>:</p>
</div>
<div class="section" id="sub-match-concept-maps">
<h2><a class="toc-backref" href="#id22">28.9.3 sub_match concept maps</a></h2>
<pre class="literal-block">
&lt;BidirectionalIterator Iter&gt;
concept_map Range&lt; sub_match&lt;Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( sub_match&lt;Iter&gt;&amp; p ) { return p.first; }
    Iter end( sub_match&lt;Iter&gt;&amp; p )   { return p.second; }
};

template&lt;BidirectionalIterator Iter&gt;
concept_map Range&lt; const sub_match&lt;Iter&gt; &gt;
{
    typedef Iter iterator;
    Iter begin( const sub_match&lt;Iter&gt;&amp; p ) { return p.first; }
    Iter end( const sub_match&lt;Iter&gt;&amp; p )   { return p.second; }
};
</pre>
<p>1 <em>Note</em>: Adapts <tt class="docutils literal"><span class="pre">sub_match</span></tt> to the <tt class="docutils literal"><span class="pre">Range</span></tt> concept.</p>
<!-- A Grammar summary -->
<!-- +++++++++++++++++ -->
<!-- **Add the following to section A.7 after the rule for 'declarator'** -->
<!--  -->
<!-- *simple-declarator:* -->
<!-- *declarator-id* -->
<!-- *ptr-operator* *simple-declarator* -->
<!-- ############################################### -->
<!-- ################## Links ###################### -->
<!-- ############################################### -->
<!-- ========= -->
<!-- Footnotes -->
<!-- ========= -->
<!-- ############################################### -->
<!-- ################## Footnotes ################## -->
<!-- ############################################### -->
</div>
</div>
</div>
</body>
</html>
