forked from boostorg/iterator
		
	
		
			
	
	
		
			5272 lines
		
	
	
		
			244 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			5272 lines
		
	
	
		
			244 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<?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.3.1: http://docutils.sourceforge.net/" />
							 | 
						||
| 
								 | 
							
								<title>Iterator concept and adapter issues</title>
							 | 
						||
| 
								 | 
							
								<meta name="date" content="2004-01-21" />
							 | 
						||
| 
								 | 
							
								<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
							 | 
						||
| 
								 | 
							
								<link rel="stylesheet" href="default.css" type="text/css" />
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								<body>
							 | 
						||
| 
								 | 
							
								<div class="document" id="iterator-concept-and-adapter-issues">
							 | 
						||
| 
								 | 
							
								<h1 class="title">Iterator concept and adapter issues</h1>
							 | 
						||
| 
								 | 
							
								<table class="docinfo" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="docinfo-name" />
							 | 
						||
| 
								 | 
							
								<col class="docinfo-content" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><th class="docinfo-name">Date:</th>
							 | 
						||
| 
								 | 
							
								<td>2004-01-21</td></tr>
							 | 
						||
| 
								 | 
							
								<tr><th class="docinfo-name">Copyright:</th>
							 | 
						||
| 
								 | 
							
								<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<div class="contents topic" id="index">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><a name="index">Index</a></p>
							 | 
						||
| 
								 | 
							
								<ul class="simple">
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#issues-from-matt-s-tr-issues-list" id="id1" name="id1">Issues from Matt's TR issues list</a><ul>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-access-overspecified" id="id2" name="id2">9.1 iterator_access overspecified?</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#operators-of-iterator-facade-overspecified" id="id3" name="id3">9.2 operators of iterator_facade overspecified</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#enable-if-interoperable-needs-standardese" id="id4" name="id4">9.3 enable_if_interoperable needs standardese</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#enable-if-convertible-unspecified-conflicts-with-requires" id="id5" name="id5">9.4 enable_if_convertible unspecified, conflicts with requires</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-adaptor-has-an-extraneous-bool-at-the-start-of-the-template-definition" id="id6" name="id6">9.5 iterator_adaptor has an extraneous 'bool' at the start of the template definition</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#name-of-private-member-shouldn-t-be-normative" id="id7" name="id7">9.6 Name of private member shouldn't be normative</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-adaptor-operations-specifications-are-a-bit-inconsistent" id="id8" name="id8">9.7 iterator_adaptor operations specifications are a bit inconsistent</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#specialized-adaptors-text-should-be-normative" id="id9" name="id9">9.8 Specialized adaptors text should be normative</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#reverse-iterator-text-is-too-informal" id="id10" name="id10">9.9 Reverse_iterator text is too informal</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#prior-is-undefined" id="id11" name="id11">9.10 'prior' is undefined</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#in-other-words-is-bad-wording" id="id12" name="id12">9.11 "In other words" is bad wording</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#transform-iterator-shouldn-t-mandate-private-member" id="id13" name="id13">9.12 Transform_iterator shouldn't mandate private member</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#unclear-description-of-counting-iterator" id="id14" name="id14">9.13 Unclear description of counting iterator</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#counting-iterator-s-difference-type" id="id15" name="id15">9.14 Counting_iterator's difference type</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#how-to-detect-lvalueness" id="id16" name="id16">9.15 How to detect lvalueness?</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#is-writable-iterator-returns-false-positives" id="id17" name="id17">9.16 is_writable_iterator returns false positives</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#is-swappable-iterator-returns-false-positives" id="id18" name="id18">9.17 is_swappable_iterator returns false positives</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#are-is-readable-is-writable-and-is-swappable-useful" id="id19" name="id19">9.18 Are is_readable, is_writable, and is_swappable useful?</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#non-uniformity-of-the-lvalue-iterator-bit" id="id20" name="id20">9.19 Non-Uniformity of the "lvalue_iterator Bit"</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#traversal-concepts-and-tags" id="id21" name="id21">9.20 Traversal Concepts and Tags</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-derived-template-argument-underspecified" id="id22" name="id22">9.21 iterator_facade Derived template argument underspecified</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#return-type-of-iterator-difference-for-iterator-facade" id="id23" name="id23">9.22 return type of Iterator difference for iterator facade</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-minor-wording-issue" id="id24" name="id24">9.23 Iterator_facade: minor wording Issue</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#use-of-undefined-name-in-iterator-facade-table" id="id25" name="id25">9.24 Use of undefined name in iterator_facade table</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-wrong-return-type" id="id26" name="id26">9.25 Iterator_facade: wrong return type</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-unclear-returns-clause-for-operator" id="id27" name="id27">9.26 Iterator_facade: unclear returns clause for operator[]</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-redundant-clause" id="id28" name="id28">9.27 Iterator_facade: redundant clause</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#indirect-iterator-incorrect-specification-of-default-constructor" id="id29" name="id29">9.28 indirect_iterator: incorrect specification of default constructor</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#indirect-iterator-unclear-specification-of-template-constructor" id="id30" name="id30">9.29 indirect_iterator: unclear specification of template constructor</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#transform-iterator-argument-irregularity" id="id31" name="id31">9.30 transform_iterator argument irregularity</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#function-output-iterator-overconstrained" id="id32" name="id32">9.31 function_output_iterator overconstrained</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#should-output-proxy-really-be-a-named-type" id="id33" name="id33">9.32 Should output_proxy really be a named type?</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#istreambuf-iterator-isn-t-a-readable-iterator" id="id34" name="id34">9.33 istreambuf_iterator isn't a Readable Iterator</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-free-functions-unspecified" id="id35" name="id35">9.34 iterator_facade free functions unspecified</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-too-many-equals" id="id36" name="id36">9.35 iterator_facade: too many equals?</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#iterator-facade-function-requirements" id="id37" name="id37">9.36 iterator_facade function requirements</a></li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#more-issues-not-from-matt-s-list" id="id38" name="id38">More Issues (not from Matt's list)</a><ul>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-inheritance-in-iterator-adaptor-and-other-adaptors-is-an-overspecification" id="id39" name="id39">9.37x Inheritance in iterator_adaptor and other adaptors is an overspecification</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-problem-with-specification-of-a-m-in-readable-iterator" id="id40" name="id40">9.38x Problem with specification of a->m in Readable Iterator</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-counting-iterator-traversal-argument-unspecified" id="id41" name="id41">9.39x counting_iterator Traversal argument unspecified</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-indirect-iterator-requirements-muddled" id="id42" name="id42">9.40x indirect_iterator requirements muddled</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-problem-with-transform-iterator-requirements" id="id43" name="id43">9.41x Problem with transform_iterator requirements</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-filter-iterator-details-unspecified" id="id44" name="id44">9.42x filter_iterator details unspecified</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-transform-iterator-interoperability-too-restrictive" id="id45" name="id45">9.43x transform_iterator interoperability too restrictive</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#y-indirect-iterator-and-smart-pointers" id="id46" name="id46">9.44y <tt class="literal"><span class="pre">indirect_iterator</span></tt> and smart pointers</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#y-n1530-typos-and-editorial-changes-in-proposal-text-not-standardese" id="id47" name="id47">9.45y N1530: Typos and editorial changes in proposal text (not standardese)</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#y-n1530-base-return-by-value-is-costly" id="id48" name="id48">9.46y N1530: <tt class="literal"><span class="pre">base()</span></tt> return-by-value is costly</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-forgot-default-constructible-in-forward-traversal-iterator" id="id49" name="id49">9.47x Forgot default constructible in Forward Traversal Iterator</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-editorial-changes-non-normative-text" id="id50" name="id50">9.48x Editorial changes (non-normative text)</a></li>
							 | 
						||
| 
								 | 
							
								<li><a class="reference" href="#x-clarification-of-iterator-facade-requirements-and-type-members" id="id51" name="id51">9.49x Clarification of iterator_facade requirements and type members</a></li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="issues-from-matt-s-tr-issues-list">
							 | 
						||
| 
								 | 
							
								<h1><a class="toc-backref" href="#id1" name="issues-from-matt-s-tr-issues-list">Issues from Matt's TR issues list</a></h1>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-access-overspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id2" name="iterator-access-overspecified">9.1 iterator_access overspecified?</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The proposal includes:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								enum iterator_access { 
							 | 
						||
| 
								 | 
							
								   readable_iterator = 1, writable_iterator = 2,
							 | 
						||
| 
								 | 
							
								   swappable_iterator = 4, lvalue_iterator = 8
							 | 
						||
| 
								 | 
							
								}; 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>In general, the standard specifies thing like this as a bitmask
							 | 
						||
| 
								 | 
							
								type with a list of defined names, and specifies neither the exact
							 | 
						||
| 
								 | 
							
								type nor the specific values. Is there a reason for iterator_access
							 | 
						||
| 
								 | 
							
								to be more specific?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">The <tt class="literal"><span class="pre">iterator_access</span></tt> enum will be removed,
							 | 
						||
| 
								 | 
							
								so this is no longer an issue.  See the resolution to 9.15.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="operators-of-iterator-facade-overspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id3" name="operators-of-iterator-facade-overspecified">9.2 operators of iterator_facade overspecified</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>In general, we've provided operational semantics for things like
							 | 
						||
| 
								 | 
							
								operator++. That is, we've said that ++iter must work, without
							 | 
						||
| 
								 | 
							
								requiring either a member function or a non-member function.
							 | 
						||
| 
								 | 
							
								iterator_facade specifies most operators as member
							 | 
						||
| 
								 | 
							
								functions. There's no inherent reason for these to be members, so
							 | 
						||
| 
								 | 
							
								we should remove this requirement. Similarly, some operations are
							 | 
						||
| 
								 | 
							
								specified as non-member functions but could be implemented as
							 | 
						||
| 
								 | 
							
								members. Again, the standard doesn't make either of these choices,
							 | 
						||
| 
								 | 
							
								and TR1 shouldn't, either. So: <tt class="literal"><span class="pre">operator*()</span></tt>, <tt class="literal"><span class="pre">operator++()</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator++(int)</span></tt>, <tt class="literal"><span class="pre">operator--()</span></tt>, <tt class="literal"><span class="pre">operator--(int)</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator+=</span></tt>, <tt class="literal"><span class="pre">operator-=</span></tt>, <tt class="literal"><span class="pre">operator-(difference_type)</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator-(iterator_facade</span> <span class="pre">instance)</span></tt>, and <tt class="literal"><span class="pre">operator+</span></tt> should
							 | 
						||
| 
								 | 
							
								be specified with operational semantics and not explicitly required
							 | 
						||
| 
								 | 
							
								to be members or non-members.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">Not a defect.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">The standard uses valid expressions such as <tt class="literal"><span class="pre">++iter</span></tt>
							 | 
						||
| 
								 | 
							
								in requirements tables, such as for input iterator.  However, for
							 | 
						||
| 
								 | 
							
								classes, such as <tt class="literal"><span class="pre">reverse_iterator</span></tt>, the standard uses function
							 | 
						||
| 
								 | 
							
								prototypes, as we have done here for
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt>. Further, the prototype specification does
							 | 
						||
| 
								 | 
							
								not prevent the implementor from using members or non-members,
							 | 
						||
| 
								 | 
							
								since nothing the user can do in a conforming program can detect
							 | 
						||
| 
								 | 
							
								how the function is implemented.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="enable-if-interoperable-needs-standardese">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id4" name="enable-if-interoperable-needs-standardese">9.3 enable_if_interoperable needs standardese</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The only discussion of what this means is in a note, so is
							 | 
						||
| 
								 | 
							
								non-normative. Further, the note seems to be incorrect. It says
							 | 
						||
| 
								 | 
							
								that enable_if_interoperable only works for types that "are
							 | 
						||
| 
								 | 
							
								interoperable, by which we mean they are convertible to each
							 | 
						||
| 
								 | 
							
								other." This requirement is too strong: it should be that one of
							 | 
						||
| 
								 | 
							
								the types is convertible to the other.  N1541 48</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Add normative text. Relax requirements in the
							 | 
						||
| 
								 | 
							
								proposed way.</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								[<em>Note:</em> The <tt class="literal"><span class="pre">enable_if_interoperable</span></tt> template used above is
							 | 
						||
| 
								 | 
							
								for exposition purposes. The member operators should be only be
							 | 
						||
| 
								 | 
							
								in an overload set provided the derived types <tt class="literal"><span class="pre">Dr1</span></tt> and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Dr2</span></tt> are interoperable, by which we mean they are
							 | 
						||
| 
								 | 
							
								convertible to each other.  The <tt class="literal"><span class="pre">enable_if_interoperable</span></tt>
							 | 
						||
| 
								 | 
							
								approach uses SFINAE to take the operators out of the overload
							 | 
						||
| 
								 | 
							
								set when the types are not interoperable.]</blockquote>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">enable_if_interoperable</span></tt> template used above is for
							 | 
						||
| 
								 | 
							
								exposition purposes.  The member operators should only be in an
							 | 
						||
| 
								 | 
							
								overload set provided the derived types <tt class="literal"><span class="pre">Dr1</span></tt> and <tt class="literal"><span class="pre">Dr2</span></tt> are
							 | 
						||
| 
								 | 
							
								interoperable, meaning that at least one of the types is
							 | 
						||
| 
								 | 
							
								convertible to the other.  The <tt class="literal"><span class="pre">enable_if_interoperable</span></tt>
							 | 
						||
| 
								 | 
							
								approach uses SFINAE to take the operators out of the overload
							 | 
						||
| 
								 | 
							
								set when the types are not interoperable.  The operators should
							 | 
						||
| 
								 | 
							
								behave <em>as-if</em> <tt class="literal"><span class="pre">enable_if_interoperable</span></tt> were defined to be:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <bool, typename> enable_if_interoperable_impl
							 | 
						||
| 
								 | 
							
								{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T> enable_if_interoperable_impl<true,T>
							 | 
						||
| 
								 | 
							
								{ typedef T type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename Dr1, typename Dr2, typename T>
							 | 
						||
| 
								 | 
							
								struct enable_if_interoperable
							 | 
						||
| 
								 | 
							
								  : enable_if_interoperable_impl<
							 | 
						||
| 
								 | 
							
								        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
							 | 
						||
| 
								 | 
							
								      , T
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								{};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="enable-if-convertible-unspecified-conflicts-with-requires">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id5" name="enable-if-convertible-unspecified-conflicts-with-requires">9.4 enable_if_convertible unspecified, conflicts with requires</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>In every place where enable_if_convertible is used it's used like
							 | 
						||
| 
								 | 
							
								this (simplified):</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template<class T>
							 | 
						||
| 
								 | 
							
								struct C
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  template<class T1>
							 | 
						||
| 
								 | 
							
								  C(T1, enable_if_convertible<T1, T>::type* = 0);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>The idea being that this constructor won't compile if T1 isn't
							 | 
						||
| 
								 | 
							
								convertible to T. As a result, the constructor won't be considered
							 | 
						||
| 
								 | 
							
								as a possible overload when constructing from an object x where the
							 | 
						||
| 
								 | 
							
								type of x isn't convertible to T. In addition, however, each of
							 | 
						||
| 
								 | 
							
								these constructors has a requires clause that requires
							 | 
						||
| 
								 | 
							
								convertibility, so the behavior of a program that attempts such a
							 | 
						||
| 
								 | 
							
								construction is undefined. Seems like the enable_if_convertible
							 | 
						||
| 
								 | 
							
								part is irrelevant, and should be removed.  There are two
							 | 
						||
| 
								 | 
							
								problems. First, enable_if_convertible is never specified, so we
							 | 
						||
| 
								 | 
							
								don't know what this is supposed to do. Second: we could reasonably
							 | 
						||
| 
								 | 
							
								say that this overload should be disabled in certain cases or we
							 | 
						||
| 
								 | 
							
								could reasonably say that behavior is undefined, but we can't say
							 | 
						||
| 
								 | 
							
								both.</p>
							 | 
						||
| 
								 | 
							
								<p>Thomas Witt writes that the goal of putting in
							 | 
						||
| 
								 | 
							
								enable_if_convertible here is to make sure that a specific overload
							 | 
						||
| 
								 | 
							
								doesn't interfere with the generic case except when that overload
							 | 
						||
| 
								 | 
							
								makes sense. He agrees that what we currently have is deficient.
							 | 
						||
| 
								 | 
							
								Dave Abrahams writes that there is no conflict with the requires
							 | 
						||
| 
								 | 
							
								cause because the requires clause only takes effect when the
							 | 
						||
| 
								 | 
							
								function is actually called. The presence of the constructor
							 | 
						||
| 
								 | 
							
								signature can/will be detected by is_convertible without violating
							 | 
						||
| 
								 | 
							
								the requires clause, and thus it makes a difference to disable
							 | 
						||
| 
								 | 
							
								those constructor instantiations that would be disabled by
							 | 
						||
| 
								 | 
							
								enable_if_convertible even if calling them invokes undefined
							 | 
						||
| 
								 | 
							
								behavior.  There was more discussion on the reflector:
							 | 
						||
| 
								 | 
							
								c++std-lib-12312, c++std-lib-12325, c++std-lib- 12330,
							 | 
						||
| 
								 | 
							
								c++std-lib-12334, c++std-lib-12335, c++std-lib-12336,
							 | 
						||
| 
								 | 
							
								c++std-lib-12338, c++std-lib- 12362.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								[<em>Note:</em> The <tt class="literal"><span class="pre">enable_if_convertible<X,Y>::type</span></tt> expression
							 | 
						||
| 
								 | 
							
								used in this section is for exposition purposes. The converting
							 | 
						||
| 
								 | 
							
								constructors for specialized adaptors should be only be in an
							 | 
						||
| 
								 | 
							
								overload set provided that an object of type <tt class="literal"><span class="pre">X</span></tt> is
							 | 
						||
| 
								 | 
							
								implicitly convertible to an object of type <tt class="literal"><span class="pre">Y</span></tt>.  The
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">enable_if_convertible</span></tt> approach uses SFINAE to take the
							 | 
						||
| 
								 | 
							
								constructor out of the overload set when the types are not
							 | 
						||
| 
								 | 
							
								implicitly convertible.]</blockquote>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">enable_if_convertible<X,Y>::type</span></tt> expression used in
							 | 
						||
| 
								 | 
							
								this section is for exposition purposes. The converting
							 | 
						||
| 
								 | 
							
								constructors for specialized adaptors should be only be in an
							 | 
						||
| 
								 | 
							
								overload set provided that an object of type <tt class="literal"><span class="pre">X</span></tt> is
							 | 
						||
| 
								 | 
							
								implicitly convertible to an object of type <tt class="literal"><span class="pre">Y</span></tt>.  The
							 | 
						||
| 
								 | 
							
								signatures involving <tt class="literal"><span class="pre">enable_if_convertible</span></tt> should behave
							 | 
						||
| 
								 | 
							
								<em>as-if</em> <tt class="literal"><span class="pre">enable_if_convertible</span></tt> were defined to be:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <bool> enable_if_convertible_impl
							 | 
						||
| 
								 | 
							
								{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <> enable_if_convertible_impl<true>
							 | 
						||
| 
								 | 
							
								{ struct type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename From, typename To>
							 | 
						||
| 
								 | 
							
								struct enable_if_convertible
							 | 
						||
| 
								 | 
							
								  : enable_if_convertible_impl<is_convertible<From,To>::value>
							 | 
						||
| 
								 | 
							
								{};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>If an expression other than the default argument is used to
							 | 
						||
| 
								 | 
							
								supply the value of a function parameter whose type is written
							 | 
						||
| 
								 | 
							
								in terms of <tt class="literal"><span class="pre">enable_if_convertible</span></tt>, the program is
							 | 
						||
| 
								 | 
							
								ill-formed, no diagnostic required.</p>
							 | 
						||
| 
								 | 
							
								<p>[<em>Note:</em> The <tt class="literal"><span class="pre">enable_if_convertible</span></tt> approach uses SFINAE to
							 | 
						||
| 
								 | 
							
								take the constructor out of the overload set when the types are
							 | 
						||
| 
								 | 
							
								not implicitly convertible.  ]</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-adaptor-has-an-extraneous-bool-at-the-start-of-the-template-definition">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id6" name="iterator-adaptor-has-an-extraneous-bool-at-the-start-of-the-template-definition">9.5 iterator_adaptor has an extraneous 'bool' at the start of the template definition</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The title says it all; this is probably just a typo.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">Remove the 'bool'.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="name-of-private-member-shouldn-t-be-normative">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id7" name="name-of-private-member-shouldn-t-be-normative">9.6 Name of private member shouldn't be normative</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>iterator_adaptor has a private member named m_iterator. Presumably
							 | 
						||
| 
								 | 
							
								this is for exposition only, since it's an implementation
							 | 
						||
| 
								 | 
							
								detail. It needs to be marked as such.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><dl class="first">
							 | 
						||
| 
								 | 
							
								<dt>Mark the member <tt class="literal"><span class="pre">m_iterator</span></tt> as exposition</dt>
							 | 
						||
| 
								 | 
							
								<dd>only.  Note/DWA: I think this is NAD because the user can't
							 | 
						||
| 
								 | 
							
								detect it, though I'm happy to mark it exposition only.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.adaptor]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Base m_iterator;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="last literal-block">
							 | 
						||
| 
								 | 
							
								Base m_iterator; // exposition only
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-adaptor-operations-specifications-are-a-bit-inconsistent">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id8" name="iterator-adaptor-operations-specifications-are-a-bit-inconsistent">9.7 iterator_adaptor operations specifications are a bit inconsistent</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>iterator_adpator() has a Requires clause, that Base must be default
							 | 
						||
| 
								 | 
							
								constructible.  iterator_adaptor(Base) has no Requires clause,
							 | 
						||
| 
								 | 
							
								although the Returns clause says that the Base member is copy
							 | 
						||
| 
								 | 
							
								construced from the argument (this may actually be an oversight in
							 | 
						||
| 
								 | 
							
								N1550, which doesn't require iterators to be copy constructible or
							 | 
						||
| 
								 | 
							
								assignable).</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Add a requirements section for the template
							 | 
						||
| 
								 | 
							
								parameters of iterator_adaptor, and state that Base must be Copy
							 | 
						||
| 
								 | 
							
								Constructible and Assignable.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">N1550 does in fact include requirements for copy constructible
							 | 
						||
| 
								 | 
							
								and assignable in the requirements tables. To clarify, we've also
							 | 
						||
| 
								 | 
							
								added the requirements to the text.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="specialized-adaptors-text-should-be-normative">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id9" name="specialized-adaptors-text-should-be-normative">9.8 Specialized adaptors text should be normative</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>similar to 9.3, "Specialized Adaptors" has a note describing
							 | 
						||
| 
								 | 
							
								enable_if_convertible. This should be normative text.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">Changed it to normative
							 | 
						||
| 
								 | 
							
								text.  See the resolution of 9.4</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="reverse-iterator-text-is-too-informal">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id10" name="reverse-iterator-text-is-too-informal">9.9 Reverse_iterator text is too informal</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>reverse iterator "flips the direction of the base iterator's
							 | 
						||
| 
								 | 
							
								motion". This needs to be more formal, as in the current
							 | 
						||
| 
								 | 
							
								standard. Something like: "iterates through the controlled sequence
							 | 
						||
| 
								 | 
							
								in the opposite direction"</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The reverse iterator adaptor flips the direction of a base
							 | 
						||
| 
								 | 
							
								iterator's motion. Invoking <tt class="literal"><span class="pre">operator++()</span></tt> moves the base
							 | 
						||
| 
								 | 
							
								iterator backward and invoking <tt class="literal"><span class="pre">operator--()</span></tt> moves the base
							 | 
						||
| 
								 | 
							
								iterator forward.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								The reverse iterator adaptor iterates through the adapted iterator
							 | 
						||
| 
								 | 
							
								range in the opposite direction.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="prior-is-undefined">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id11" name="prior-is-undefined">9.10 'prior' is undefined</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>reverse_iterator::dereference is specified as calling a function
							 | 
						||
| 
								 | 
							
								named 'prior' which has no specification.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change the specification to avoid using <tt class="literal"><span class="pre">prior</span></tt> as follows.</p>
							 | 
						||
| 
								 | 
							
								<p>Remove:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>And at the end of the operations section add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Iterator tmp = m_iterator;
							 | 
						||
| 
								 | 
							
								return *--tmp;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">The style of specification has changed because of issue 9.37x.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="in-other-words-is-bad-wording">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id12" name="in-other-words-is-bad-wording">9.11 "In other words" is bad wording</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Transform iterator has a two-part specification: it does this, in
							 | 
						||
| 
								 | 
							
								other words, it does that. "In other words" always means "I didn't
							 | 
						||
| 
								 | 
							
								say it right, so I'll try again." We need to say it once.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The transform iterator adapts an iterator by applying some function
							 | 
						||
| 
								 | 
							
								object to the result of dereferencing the iterator. In other words,
							 | 
						||
| 
								 | 
							
								the <tt class="literal"><span class="pre">operator*</span></tt> of the transform iterator first dereferences the
							 | 
						||
| 
								 | 
							
								base iterator, passes the result of this to the function object, and
							 | 
						||
| 
								 | 
							
								then returns the result.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								The transform iterator adapts an iterator by modifying the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator*</span></tt> to apply a function object to the result of
							 | 
						||
| 
								 | 
							
								dereferencing the iterator and returning the result.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="transform-iterator-shouldn-t-mandate-private-member">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id13" name="transform-iterator-shouldn-t-mandate-private-member">9.12 Transform_iterator shouldn't mandate private member</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>transform_iterator has a private member named 'm_f' which should be
							 | 
						||
| 
								 | 
							
								marked "exposition only."</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Mark the member <tt class="literal"><span class="pre">m_f</span></tt> as exposition
							 | 
						||
| 
								 | 
							
								only. Note/DWA: I think this is NAD because the user can't
							 | 
						||
| 
								 | 
							
								detect it, though I'm happy to mark it exposition only.</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								UnaryFunction m_f;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="last literal-block">
							 | 
						||
| 
								 | 
							
								UnaryFunction m_f;   // exposition only
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="unclear-description-of-counting-iterator">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id14" name="unclear-description-of-counting-iterator">9.13 Unclear description of counting iterator</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The description of Counting iterator is unclear. "The counting
							 | 
						||
| 
								 | 
							
								iterator adaptor implements dereference by returning a reference to
							 | 
						||
| 
								 | 
							
								the base object. The other operations are implemented by the base
							 | 
						||
| 
								 | 
							
								m_iterator, as per the inheritance from iterator_adaptor."</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The counting iterator adaptor implements dereference by
							 | 
						||
| 
								 | 
							
								returning a reference to the base object. The other operations
							 | 
						||
| 
								 | 
							
								are implemented by the base <tt class="literal"><span class="pre">m_iterator</span></tt>, as per the
							 | 
						||
| 
								 | 
							
								inheritance from <tt class="literal"><span class="pre">iterator_adaptor</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">counting_iterator</span></tt> adapts an object by adding an
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator*</span></tt> that returns the current value of the object. All
							 | 
						||
| 
								 | 
							
								other iterator operations are forwarded to the adapted object.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="counting-iterator-s-difference-type">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id15" name="counting-iterator-s-difference-type">9.14 Counting_iterator's difference type</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Counting iterator has the following note:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								[Note: implementers are encouraged to provide an implementation
							 | 
						||
| 
								 | 
							
								of distance_to and a difference_type that avoids overflows in the
							 | 
						||
| 
								 | 
							
								cases when the Incrementable type is a numeric type.]</blockquote>
							 | 
						||
| 
								 | 
							
								<p>I'm not sure what this means. The user provides a template argument
							 | 
						||
| 
								 | 
							
								named Difference, but there's no difference_type. I assume this is
							 | 
						||
| 
								 | 
							
								just a glitch in the wording. But if implementors are encouraged to
							 | 
						||
| 
								 | 
							
								ignore this argument if it won't work right, why is it there?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">The <tt class="literal"><span class="pre">difference_type</span></tt> was inherited from
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_adaptor</span></tt>.  However, we've removed the explicit
							 | 
						||
| 
								 | 
							
								inheritance, so explicit typedefs have been added. See the
							 | 
						||
| 
								 | 
							
								resolution of 9.37x.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="how-to-detect-lvalueness">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id16" name="how-to-detect-lvalueness">9.15 How to detect lvalueness?</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Shortly after N1550 was accepted, we discovered that an iterator's
							 | 
						||
| 
								 | 
							
								lvalueness can be determined knowing only its value_type. This
							 | 
						||
| 
								 | 
							
								predicate can be calculated even for old-style iterators (on whose
							 | 
						||
| 
								 | 
							
								reference type the standard places few requirements). A trait in
							 | 
						||
| 
								 | 
							
								the Boost iterator library does it by relying on the compiler's
							 | 
						||
| 
								 | 
							
								unwillingness to bind an rvalue to a T& function template
							 | 
						||
| 
								 | 
							
								parameter. Similarly, it is possible to detect an iterator's
							 | 
						||
| 
								 | 
							
								readability knowing only its value_type.  Thus, any interface which
							 | 
						||
| 
								 | 
							
								asks the user to explicitly describe an iterator's lvalue-ness or
							 | 
						||
| 
								 | 
							
								readability seems to introduce needless complexity.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><ol class="first arabic simple">
							 | 
						||
| 
								 | 
							
								<li>Remove the <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> traits, and
							 | 
						||
| 
								 | 
							
								remove the requirements in the Writable Iterator and Swappable
							 | 
						||
| 
								 | 
							
								Iterator concepts that require their models to support these
							 | 
						||
| 
								 | 
							
								traits.</li>
							 | 
						||
| 
								 | 
							
								<li>Change the <tt class="literal"><span class="pre">is_readable</span></tt> specification.  Remove the
							 | 
						||
| 
								 | 
							
								requirement for support of the <tt class="literal"><span class="pre">is_readable</span></tt> trait from the
							 | 
						||
| 
								 | 
							
								Readable Iterator concept.</li>
							 | 
						||
| 
								 | 
							
								<li>Remove the <tt class="literal"><span class="pre">iterator_tag</span></tt> class and transplant the logic for
							 | 
						||
| 
								 | 
							
								choosing an iterator category into <tt class="literal"><span class="pre">iterator_facade</span></tt>.</li>
							 | 
						||
| 
								 | 
							
								<li>Change the specification of <tt class="literal"><span class="pre">traversal_category</span></tt>.</li>
							 | 
						||
| 
								 | 
							
								<li>Remove Access parameters from N1530</li>
							 | 
						||
| 
								 | 
							
								</ol>
							 | 
						||
| 
								 | 
							
								<p>In N1550:</p>
							 | 
						||
| 
								 | 
							
								<p>Remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>Since the access concepts are not related via refinement, but
							 | 
						||
| 
								 | 
							
								instead cover orthogonal issues, we do not use tags for the
							 | 
						||
| 
								 | 
							
								access concepts, but instead use the equivalent of a bit field.</p>
							 | 
						||
| 
								 | 
							
								<p>We provide an access mechanism for mapping iterator types to
							 | 
						||
| 
								 | 
							
								the new traversal tags and access bit field. Our design reuses
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iter>::iterator_category</span></tt> as the access
							 | 
						||
| 
								 | 
							
								mechanism. To that end, the access and traversal information is
							 | 
						||
| 
								 | 
							
								bundled into a single type using the following <cite>iterator_tag</cite>
							 | 
						||
| 
								 | 
							
								class.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								enum iterator_access { readable_iterator = 1, writable_iterator = 2, 
							 | 
						||
| 
								 | 
							
								    swappable_iterator = 4, lvalue_iterator = 8 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <unsigned int access_bits, class TraversalTag>
							 | 
						||
| 
								 | 
							
								struct iterator_tag : /* appropriate old category or categories */ {
							 | 
						||
| 
								 | 
							
								  static const iterator_access access =
							 | 
						||
| 
								 | 
							
								    (iterator_access)access_bits & 
							 | 
						||
| 
								 | 
							
								      (readable_iterator | writable_iterator | swappable_iterator);
							 | 
						||
| 
								 | 
							
								  typedef TraversalTag traversal;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">access_bits</span></tt> argument is declared to be <tt class="literal"><span class="pre">unsigned</span> <span class="pre">int</span></tt>
							 | 
						||
| 
								 | 
							
								instead of the enum <tt class="literal"><span class="pre">iterator_access</span></tt> for convenience of
							 | 
						||
| 
								 | 
							
								use. For example, the expression <tt class="literal"><span class="pre">(readable_iterator</span> <span class="pre">|</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">writable_iterator)</span></tt> produces an unsigned int, not an
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_access</span></tt>.  The purpose of the <tt class="literal"><span class="pre">lvalue_iterator</span></tt>
							 | 
						||
| 
								 | 
							
								part of the <tt class="literal"><span class="pre">iterator_access</span></tt> enum is to communicate to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_tag</span></tt> whether the reference type is an lvalue so
							 | 
						||
| 
								 | 
							
								that the appropriate old category can be chosen for the base
							 | 
						||
| 
								 | 
							
								class. The <tt class="literal"><span class="pre">lvalue_iterator</span></tt> bit is not recorded in the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_tag::access</span></tt> data member.</p>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">iterator_tag</span></tt> class template is derived from the
							 | 
						||
| 
								 | 
							
								appropriate iterator tag or tags from the old requirements
							 | 
						||
| 
								 | 
							
								based on the access bits and traversal tag passed as template
							 | 
						||
| 
								 | 
							
								parameters.  The algorithm for determining the old tag or tags
							 | 
						||
| 
								 | 
							
								picks the least refined old concepts that include all of the
							 | 
						||
| 
								 | 
							
								requirements of the access and traversal concepts (that is, the
							 | 
						||
| 
								 | 
							
								closest fit), if any such category exists.  For example, the
							 | 
						||
| 
								 | 
							
								category tag for a Readable Single Pass Iterator will always be
							 | 
						||
| 
								 | 
							
								derived from <tt class="literal"><span class="pre">input_iterator_tag</span></tt>, while the category tag for
							 | 
						||
| 
								 | 
							
								a Single Pass Iterator that is both Readable and Writable will
							 | 
						||
| 
								 | 
							
								be derived from both <tt class="literal"><span class="pre">input_iterator_tag</span></tt> and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">output_iterator_tag</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p>We also provide several helper classes that make it convenient
							 | 
						||
| 
								 | 
							
								to obtain the access and traversal characteristics of an
							 | 
						||
| 
								 | 
							
								iterator. These helper classes work both for iterators whose
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt> is <tt class="literal"><span class="pre">iterator_tag</span></tt> and also for
							 | 
						||
| 
								 | 
							
								iterators using the original iterator categories.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_readable  { typedef ... type; };
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_writable { typedef ... type; };
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_swappable { typedef ... type; };
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct traversal_category { typedef ... type; };
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>After:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Like the old iterator requirements, we provide tags for
							 | 
						||
| 
								 | 
							
								purposes of dispatching based on the traversal concepts.  The
							 | 
						||
| 
								 | 
							
								tags are related via inheritance so that a tag is convertible
							 | 
						||
| 
								 | 
							
								to another tag if the concept associated with the first tag is
							 | 
						||
| 
								 | 
							
								a refinement of the second tag.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>Our design reuses <tt class="literal"><span class="pre">iterator_traits<Iter>::iterator_category</span></tt>
							 | 
						||
| 
								 | 
							
								to indicate an iterator's traversal capability.  To specify
							 | 
						||
| 
								 | 
							
								capabilities not captured by any old-style iterator category,
							 | 
						||
| 
								 | 
							
								an iterator designer can use an <tt class="literal"><span class="pre">iterator_category</span></tt> type that
							 | 
						||
| 
								 | 
							
								is convertible to both the the most-derived old iterator
							 | 
						||
| 
								 | 
							
								category tag which fits, and the appropriate new iterator
							 | 
						||
| 
								 | 
							
								traversal tag.</p>
							 | 
						||
| 
								 | 
							
								<p>We do not provide tags for the purposes of dispatching based on
							 | 
						||
| 
								 | 
							
								the access concepts, in part because we could not find a way to
							 | 
						||
| 
								 | 
							
								automatically infer the right access tags for old-style
							 | 
						||
| 
								 | 
							
								iterators.  An iterator's writability may be dependent on the
							 | 
						||
| 
								 | 
							
								assignability of its <tt class="literal"><span class="pre">value_type</span></tt> and there's no known way to
							 | 
						||
| 
								 | 
							
								detect whether an arbitrary type is assignable.  Fortunately,
							 | 
						||
| 
								 | 
							
								the need for dispatching based on access capability is not as
							 | 
						||
| 
								 | 
							
								great as the need for dispatching based on traversal
							 | 
						||
| 
								 | 
							
								capability.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>From the Readable Iterator Requirements table, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">is_readable<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">true_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>From the Writable Iterator Requirements table, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="21%" />
							 | 
						||
| 
								 | 
							
								<col width="42%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">is_writable<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">true_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>From the Swappable Iterator Requirements table, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="43%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">is_swappable<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">true_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>From [lib.iterator.synopsis] replace:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_readable;
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_writable;
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_swappable;
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct traversal_category;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum iterator_access { readable_iterator = 1, writable_iterator = 2, 
							 | 
						||
| 
								 | 
							
								    swappable_iterator = 4, lvalue_iterator = 8 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <unsigned int access_bits, class TraversalTag>
							 | 
						||
| 
								 | 
							
								struct iterator_tag : /* appropriate old category or categories */ {
							 | 
						||
| 
								 | 
							
								  static const iterator_access access =
							 | 
						||
| 
								 | 
							
								    (iterator_access)access_bits & 
							 | 
						||
| 
								 | 
							
								      (readable_iterator | writable_iterator | swappable_iterator);
							 | 
						||
| 
								 | 
							
								  typedef TraversalTag traversal;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>with:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct is_readable_iterator;
							 | 
						||
| 
								 | 
							
								template <class Iterator> struct iterator_traversal;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.traits], remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">iterator_tag</span></tt> class template is an iterator category tag
							 | 
						||
| 
								 | 
							
								that encodes the access enum and traversal tag in addition to
							 | 
						||
| 
								 | 
							
								being compatible with the original iterator tags.  The
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_tag</span></tt> class inherits from one of the original
							 | 
						||
| 
								 | 
							
								iterator tags according to the following pseudo-code.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								inherit-category(access, traversal-tag) =
							 | 
						||
| 
								 | 
							
								     if ((access & readable_iterator) && (access & lvalue_iterator)) {
							 | 
						||
| 
								 | 
							
								         if (traversal-tag is convertible to random_access_traversal_tag)
							 | 
						||
| 
								 | 
							
								             return random_access_iterator_tag;
							 | 
						||
| 
								 | 
							
								         else if (traversal-tag is convertible to bidirectional_traversal_tag)
							 | 
						||
| 
								 | 
							
								             return bidirectional_iterator_tag;
							 | 
						||
| 
								 | 
							
								         else if (traversal-tag is convertible to forward_traversal_tag)
							 | 
						||
| 
								 | 
							
								             return forward_iterator_tag;
							 | 
						||
| 
								 | 
							
								         else if (traversal-tag is convertible to single_pass_traversal_tag)
							 | 
						||
| 
								 | 
							
								             if (access-tag is convertible to writable_iterator_tag)
							 | 
						||
| 
								 | 
							
								                 return input_output_iterator_tag;
							 | 
						||
| 
								 | 
							
								             else
							 | 
						||
| 
								 | 
							
								                 return input_iterator_tag;
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								             return null_category_tag;
							 | 
						||
| 
								 | 
							
								     } else if ((access & readable_iterator) and (access & writable_iterator)
							 | 
						||
| 
								 | 
							
								                and traversal-tag is convertible to single_pass_iterator_tag)
							 | 
						||
| 
								 | 
							
								         return input_output_iterator_tag;
							 | 
						||
| 
								 | 
							
								     else if (access & readable_iterator
							 | 
						||
| 
								 | 
							
								              and traversal-tag is convertible to single_pass_iterator_tag)
							 | 
						||
| 
								 | 
							
								         return input_iterator_tag;
							 | 
						||
| 
								 | 
							
								     else if (access & writable_iterator
							 | 
						||
| 
								 | 
							
								              and traversal-tag is convertible to incrementable_iterator_tag)
							 | 
						||
| 
								 | 
							
								         return output_iterator_tag;
							 | 
						||
| 
								 | 
							
								     else
							 | 
						||
| 
								 | 
							
								         return null_category_tag;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>If the argument for <tt class="literal"><span class="pre">TraversalTag</span></tt> is not convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">incrementable_iterator_tag</span></tt> then the program is ill-formed.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">is_readable</span></tt>, <tt class="literal"><span class="pre">is_writable</span></tt>, <tt class="literal"><span class="pre">is_swappable</span></tt>, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">traversal_category</span></tt> class templates are traits classes. For
							 | 
						||
| 
								 | 
							
								iterators whose <tt class="literal"><span class="pre">iterator_traits<Iter>::iterator_category</span></tt>
							 | 
						||
| 
								 | 
							
								type is <tt class="literal"><span class="pre">iterator_tag</span></tt>, these traits obtain the <tt class="literal"><span class="pre">access</span></tt>
							 | 
						||
| 
								 | 
							
								enum and <tt class="literal"><span class="pre">traversal</span></tt> member type from within
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_tag</span></tt>.  For iterators whose
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iter>::iterator_category</span></tt> type is not
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_tag</span></tt> and instead is a tag convertible to one of the
							 | 
						||
| 
								 | 
							
								original tags, the appropriate traversal tag and access bits
							 | 
						||
| 
								 | 
							
								are deduced.  The following pseudo-code describes the
							 | 
						||
| 
								 | 
							
								algorithm.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								is-readable(Iterator) = 
							 | 
						||
| 
								 | 
							
								    cat = iterator_traits<Iterator>::iterator_category;
							 | 
						||
| 
								 | 
							
								    if (cat == iterator_tag<Access,Traversal>)
							 | 
						||
| 
								 | 
							
								        return Access & readable_iterator;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to input_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								is-writable(Iterator) =
							 | 
						||
| 
								 | 
							
								    cat = iterator_traits<Iterator>::iterator_category;
							 | 
						||
| 
								 | 
							
								    if (cat == iterator_tag<Access,Traversal>)
							 | 
						||
| 
								 | 
							
								        return Access & writable_iterator;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to output_iterator_tag)
							 | 
						||
| 
								 | 
							
								         return true;
							 | 
						||
| 
								 | 
							
								    else if (
							 | 
						||
| 
								 | 
							
								         cat is convertible to forward_iterator_tag
							 | 
						||
| 
								 | 
							
								         and iterator_traits<Iterator>::reference is a 
							 | 
						||
| 
								 | 
							
								             mutable reference)
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								is-swappable(Iterator) =
							 | 
						||
| 
								 | 
							
								    cat = iterator_traits<Iterator>::iterator_category;
							 | 
						||
| 
								 | 
							
								    if (cat == iterator_tag<Access,Traversal>)
							 | 
						||
| 
								 | 
							
								        return Access & swappable_iterator;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to forward_iterator_tag) {
							 | 
						||
| 
								 | 
							
								        if (iterator_traits<Iterator>::reference is a const reference)
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								    } else 
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								traversal-category(Iterator) =
							 | 
						||
| 
								 | 
							
								    cat = iterator_traits<Iterator>::iterator_category;
							 | 
						||
| 
								 | 
							
								    if (cat == iterator_tag<Access,Traversal>)
							 | 
						||
| 
								 | 
							
								        return Traversal;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to random_access_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return random_access_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to bidirectional_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return bidirectional_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to forward_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return forward_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to input_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return single_pass_iterator_tag;
							 | 
						||
| 
								 | 
							
								    else if (cat is convertible to output_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return incrementable_iterator_tag;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        return null_category_tag;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>The following specializations provide the access and traversal
							 | 
						||
| 
								 | 
							
								category tags for pointer types.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_readable<const T*> { typedef true_type type; };
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_writable<const T*> { typedef false_type type; };
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_swappable<const T*> { typedef false_type type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_readable<T*> { typedef true_type type; };
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_writable<T*> { typedef true_type type; };
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct is_swappable<T*> { typedef true_type type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								struct traversal_category<T*>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  typedef random_access_traversal_tag type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">is_readable_iterator</span></tt> class template satisfies the
							 | 
						||
| 
								 | 
							
								UnaryTypeTrait requirements.</p>
							 | 
						||
| 
								 | 
							
								<p>Given an iterator type <tt class="literal"><span class="pre">X</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">is_readable_iterator<X>::value</span></tt> yields <tt class="literal"><span class="pre">true</span></tt> if, for an
							 | 
						||
| 
								 | 
							
								object <tt class="literal"><span class="pre">a</span></tt> of type <tt class="literal"><span class="pre">X</span></tt>, <tt class="literal"><span class="pre">*a</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt>, and <tt class="literal"><span class="pre">false</span></tt> otherwise.</p>
							 | 
						||
| 
								 | 
							
								<a class="target" id="category-to-traversal" name="category-to-traversal"></a><p><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt> is</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								<em>category-to-traversal</em>(iterator_traits<X>::iterator_category) 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>where <em>category-to-traversal</em> is defined as follows</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								<em>category-to-traversal</em>(C) =
							 | 
						||
| 
								 | 
							
								    if (C is convertible to incrementable_traversal_tag)
							 | 
						||
| 
								 | 
							
								        return C;
							 | 
						||
| 
								 | 
							
								    else if (C is convertible to random_access_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return random_access_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (C is convertible to bidirectional_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return bidirectional_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (C is convertible to forward_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return forward_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (C is convertible to input_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return single_pass_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else if (C is convertible to output_iterator_tag)
							 | 
						||
| 
								 | 
							
								        return incrementable_traversal_tag;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        <em>the program is ill-formed</em>
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In N1530:</p>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.helper.synopsis]:</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								const unsigned use_default_access = -1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct iterator_core_access { /* implementation detail */ };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Value
							 | 
						||
| 
								 | 
							
								  , unsigned AccessCategory
							 | 
						||
| 
								 | 
							
								  , class TraversalCategory
							 | 
						||
| 
								 | 
							
								  , class Reference  = Value&
							 | 
						||
| 
								 | 
							
								  , class Difference = ptrdiff_t
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_facade;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Base
							 | 
						||
| 
								 | 
							
								  , class Value      = use_default
							 | 
						||
| 
								 | 
							
								  , unsigned Access  = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference  = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_adaptor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator
							 | 
						||
| 
								 | 
							
								  , class Value = use_default
							 | 
						||
| 
								 | 
							
								  , unsigned Access  = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class indirect_iterator;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								struct iterator_core_access { /* implementation detail */ };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Value
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal
							 | 
						||
| 
								 | 
							
								  , class Reference  = Value&
							 | 
						||
| 
								 | 
							
								  , class Difference = ptrdiff_t
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_facade;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Base
							 | 
						||
| 
								 | 
							
								  , class Value      = use_default
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference  = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_adaptor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator
							 | 
						||
| 
								 | 
							
								  , class Value = use_default
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class indirect_iterator;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Incrementable
							 | 
						||
| 
								 | 
							
								  , unsigned Access  = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class counting_iterator
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Incrementable
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class counting_iterator;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.facade]:</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Value
							 | 
						||
| 
								 | 
							
								  , unsigned AccessCategory
							 | 
						||
| 
								 | 
							
								  , class TraversalCategory
							 | 
						||
| 
								 | 
							
								  , class Reference  = /* see below */
							 | 
						||
| 
								 | 
							
								  , class Difference = ptrdiff_t
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_facade {
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Value
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal
							 | 
						||
| 
								 | 
							
								  , class Reference  = Value&
							 | 
						||
| 
								 | 
							
								  , class Difference = ptrdiff_t
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_facade {
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								typedef iterator_tag<AccessCategory, TraversalCategory> iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								// Comparison operators
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type // exposition
							 | 
						||
| 
								 | 
							
								operator ==(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator !=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator <(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator <=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator >(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator >=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator >=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Iterator difference
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator -(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Iterator addition
							 | 
						||
| 
								 | 
							
								template <class Derived, class V, class AC, class TC, class R, class D>
							 | 
						||
| 
								 | 
							
								Derived operator+ (iterator_facade<Derived, V, AC, TC, R, D> const&,
							 | 
						||
| 
								 | 
							
								                   typename Derived::difference_type n)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								// Comparison operators
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
							 | 
						||
| 
								 | 
							
								operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Iterator difference
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								/* see below */
							 | 
						||
| 
								 | 
							
								operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Iterator addition
							 | 
						||
| 
								 | 
							
								template <class Dr, class V, class TC, class R, class D>
							 | 
						||
| 
								 | 
							
								Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
							 | 
						||
| 
								 | 
							
								                   typename Derived::difference_type n);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr, class V, class TC, class R, class D>
							 | 
						||
| 
								 | 
							
								Derived operator+ (typename Derived::difference_type n,
							 | 
						||
| 
								 | 
							
								                   iterator_facade<Dr,V,TC,R,D> const&);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>After the <tt class="literal"><span class="pre">iterator_facade</span></tt> synopsis, add:</p>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">iterator_category</span></tt> member of <tt class="literal"><span class="pre">iterator_facade</span></tt> is</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								<em>iterator-category</em>(CategoryOrTraversal, value_type, reference)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>where <em>iterator-category</em> is defined as follows:</p>
							 | 
						||
| 
								 | 
							
								<pre class="last literal-block">
							 | 
						||
| 
								 | 
							
								<em>iterator-category</em>(C,R,V) :=
							 | 
						||
| 
								 | 
							
								   if (C is convertible to std::input_iterator_tag
							 | 
						||
| 
								 | 
							
								       || C is convertible to std::output_iterator_tag
							 | 
						||
| 
								 | 
							
								   )
							 | 
						||
| 
								 | 
							
								       return C
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   else if (C is not convertible to incrementable_traversal_tag)
							 | 
						||
| 
								 | 
							
								       <em>the program is ill-formed</em>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   else return a type X satisfying the following two constraints:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      1. X is convertible to X1, and not to any more-derived
							 | 
						||
| 
								 | 
							
								         type, where X1 is defined by:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								           if (R is a reference type
							 | 
						||
| 
								 | 
							
								               && C is convertible to forward_traversal_tag)
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								               if (C is convertible to random_access_traversal_tag)
							 | 
						||
| 
								 | 
							
								                   X1 = random_access_iterator_tag
							 | 
						||
| 
								 | 
							
								               else if (C is convertible to bidirectional_traversal_tag)
							 | 
						||
| 
								 | 
							
								                   X1 = bidirectional_iterator_tag
							 | 
						||
| 
								 | 
							
								               else
							 | 
						||
| 
								 | 
							
								                   X1 = forward_iterator_tag
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								           else
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								               if (C is convertible to single_pass_traversal_tag
							 | 
						||
| 
								 | 
							
								                   && R is convertible to V)
							 | 
						||
| 
								 | 
							
								                   X1 = input_iterator_tag
							 | 
						||
| 
								 | 
							
								               else
							 | 
						||
| 
								 | 
							
								                   X1 = C
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      2. <a class="reference" href="#category-to-traversal"><em>category-to-traversal</em></a>(X) is convertible to the most
							 | 
						||
| 
								 | 
							
								         derived traversal tag type to which X is also
							 | 
						||
| 
								 | 
							
								         convertible, and not to any more-derived traversal tag
							 | 
						||
| 
								 | 
							
								         type.
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<a class="target" id="iterator-category" name="iterator-category"></a><blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.facade] <tt class="literal"><span class="pre">iterator_facade</span></tt> requirements:</p>
							 | 
						||
| 
								 | 
							
								<p>Remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">AccessCategory</span></tt> must be an unsigned value which uses no more
							 | 
						||
| 
								 | 
							
								bits than the greatest value of <tt class="literal"><span class="pre">iterator_access</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In the <strong>Iterator Adaptor</strong> section, change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Several of the template parameters of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> default
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">use_default</span></tt> (or <tt class="literal"><span class="pre">use_default_access</span></tt>).</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Several of the template parameters of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> default
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">use_default</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.special.adaptors]:</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator
							 | 
						||
| 
								 | 
							
								  , class Value = use_default
							 | 
						||
| 
								 | 
							
								  , unsigned Access  = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class indirect_iterator
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator
							 | 
						||
| 
								 | 
							
								  , class Value = use_default
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class indirect_iterator
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator2, class Value2, unsigned Access2, class Traversal2
							 | 
						||
| 
								 | 
							
								  , class Reference2, class Difference2
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								indirect_iterator(
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Iterator2, class Value2, class Category2
							 | 
						||
| 
								 | 
							
								  , class Reference2, class Difference2
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								indirect_iterator(
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Incrementable
							 | 
						||
| 
								 | 
							
								  , unsigned Access = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class counting_iterator
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Incrementable
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class counting_iterator
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								typedef iterator_tag<
							 | 
						||
| 
								 | 
							
								      writable_iterator
							 | 
						||
| 
								 | 
							
								    , incrementable_traversal_tag
							 | 
						||
| 
								 | 
							
								> iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								typedef std::output_iterator_tag iterator_category;</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.adaptor]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Base
							 | 
						||
| 
								 | 
							
								  , class Value      = use_default
							 | 
						||
| 
								 | 
							
								  , unsigned Access  = use_default_access
							 | 
						||
| 
								 | 
							
								  , class Traversal  = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference  = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_adaptor 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Derived
							 | 
						||
| 
								 | 
							
								  , class Base
							 | 
						||
| 
								 | 
							
								  , class Value               = use_default
							 | 
						||
| 
								 | 
							
								  , class CategoryOrTraversal = use_default
							 | 
						||
| 
								 | 
							
								  , class Reference           = use_default
							 | 
						||
| 
								 | 
							
								  , class Difference = use_default
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								class iterator_adaptor 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body"></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<ol class="arabic simple">
							 | 
						||
| 
								 | 
							
								<li>There are two reasons for removing <tt class="literal"><span class="pre">is_writable</span></tt>
							 | 
						||
| 
								 | 
							
								and <tt class="literal"><span class="pre">is_swappable</span></tt>. The first is that we do not know of
							 | 
						||
| 
								 | 
							
								a way to fix the specification so that it gives the correct
							 | 
						||
| 
								 | 
							
								answer for all iterators. Second, there was only a weak
							 | 
						||
| 
								 | 
							
								motivation for having <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt>
							 | 
						||
| 
								 | 
							
								there in the first place.  The main motivation was simply
							 | 
						||
| 
								 | 
							
								uniformity: we have tags for the old iterator categories
							 | 
						||
| 
								 | 
							
								so we should have tags for the new iterator categories.
							 | 
						||
| 
								 | 
							
								While having tags and the capability to dispatch based
							 | 
						||
| 
								 | 
							
								on the traversal categories is often used, we see
							 | 
						||
| 
								 | 
							
								less of a need for dispatching based on writability
							 | 
						||
| 
								 | 
							
								and swappability, since typically algorithms
							 | 
						||
| 
								 | 
							
								that need these capabilities have no alternative if
							 | 
						||
| 
								 | 
							
								they are not provided.</li>
							 | 
						||
| 
								 | 
							
								<li>We discovered that the <tt class="literal"><span class="pre">is_readable</span></tt> trait can be implemented
							 | 
						||
| 
								 | 
							
								using only the iterator type itself and its <tt class="literal"><span class="pre">value_type</span></tt>.
							 | 
						||
| 
								 | 
							
								Therefore we remove the requirement for <tt class="literal"><span class="pre">is_readable</span></tt> from the
							 | 
						||
| 
								 | 
							
								Readable Iterator concept, and change the definition of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">is_readable</span></tt> so that it works for any iterator type.</li>
							 | 
						||
| 
								 | 
							
								<li>The purpose of the <tt class="literal"><span class="pre">iterator_tag</span></tt> class was to bundle the
							 | 
						||
| 
								 | 
							
								traversal and access category tags into the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt> typedef.  With <tt class="literal"><span class="pre">is_writable</span></tt> and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">is_swappable</span></tt> gone, and <tt class="literal"><span class="pre">is_readable</span></tt> no longer in need of
							 | 
						||
| 
								 | 
							
								special hints, there is no reason for iterators to provide
							 | 
						||
| 
								 | 
							
								information about the access capabilities of an iterator.  Thus
							 | 
						||
| 
								 | 
							
								there is no need for the <tt class="literal"><span class="pre">iterator_tag</span></tt>. The traversal tag can
							 | 
						||
| 
								 | 
							
								be directly used for the <tt class="literal"><span class="pre">iterator_category</span></tt>. If a new
							 | 
						||
| 
								 | 
							
								iterator is intended to be backward compatible with old iterator
							 | 
						||
| 
								 | 
							
								concepts, a tag type that is convertible to both one of the new
							 | 
						||
| 
								 | 
							
								traversal tags and also to an old iterator tag can be created
							 | 
						||
| 
								 | 
							
								and use for the <tt class="literal"><span class="pre">iterator_category</span></tt>.</li>
							 | 
						||
| 
								 | 
							
								<li>The changes to the specification of <tt class="literal"><span class="pre">traversal_category</span></tt> are a 
							 | 
						||
| 
								 | 
							
								direct result of the removal of <tt class="literal"><span class="pre">iterator_tag</span></tt>.</li>
							 | 
						||
| 
								 | 
							
								</ol>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="is-writable-iterator-returns-false-positives">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id17" name="is-writable-iterator-returns-false-positives">9.16 is_writable_iterator returns false positives</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>is_writable_iterator returns false positives for forward iterators
							 | 
						||
| 
								 | 
							
								whose value_type has a private assignment operator, or whose
							 | 
						||
| 
								 | 
							
								reference type is not a reference (currently legal).</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed Resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">See the resolution to 9.15.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="is-swappable-iterator-returns-false-positives">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id18" name="is-swappable-iterator-returns-false-positives">9.17 is_swappable_iterator returns false positives</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>is_swappable_iterator has the same problems as
							 | 
						||
| 
								 | 
							
								is_writable_iterator. In addition, if we allow users to write their
							 | 
						||
| 
								 | 
							
								own iter_swap functions it's easy to imagine old-style iterators
							 | 
						||
| 
								 | 
							
								for which is_swappable returns false negatives.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed Resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">See the resolution to 9.15.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="are-is-readable-is-writable-and-is-swappable-useful">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id19" name="are-is-readable-is-writable-and-is-swappable-useful">9.18 Are is_readable, is_writable, and is_swappable useful?</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>I am concerned that there is little use for any of is_readable,
							 | 
						||
| 
								 | 
							
								is_writable, or is_swappable, and that not only do they unduly
							 | 
						||
| 
								 | 
							
								constrain iterator implementors but they add overhead to
							 | 
						||
| 
								 | 
							
								iterator_facade and iterator_adaptor in the form of a template
							 | 
						||
| 
								 | 
							
								parameter which would otherwise be unneeded. Since we can't
							 | 
						||
| 
								 | 
							
								implement two of them accurately for old-style iterators, I am
							 | 
						||
| 
								 | 
							
								having a hard time justifying their impact on the rest of the
							 | 
						||
| 
								 | 
							
								proposal(s).</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed Resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">See the resolution to 9.15.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="non-uniformity-of-the-lvalue-iterator-bit">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id20" name="non-uniformity-of-the-lvalue-iterator-bit">9.19 Non-Uniformity of the "lvalue_iterator Bit"</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The proposed iterator_tag class template accepts an "access bits"
							 | 
						||
| 
								 | 
							
								parameter which includes a bit to indicate the iterator's
							 | 
						||
| 
								 | 
							
								lvalueness (whether its dereference operator returns a reference to
							 | 
						||
| 
								 | 
							
								its value_type. The relevant part of N1550 says:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The purpose of the lvalue_iterator part of the iterator_access
							 | 
						||
| 
								 | 
							
								enum is to communicate to iterator_tagwhether the reference type
							 | 
						||
| 
								 | 
							
								is an lvalue so that the appropriate old category can be chosen
							 | 
						||
| 
								 | 
							
								for the base class. The lvalue_iterator bit is not recorded in
							 | 
						||
| 
								 | 
							
								the iterator_tag::access data member.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>The lvalue_iterator bit is not recorded because N1550 aims to
							 | 
						||
| 
								 | 
							
								improve orthogonality of the iterator concepts, and a new-style
							 | 
						||
| 
								 | 
							
								iterator's lvalueness is detectable by examining its reference
							 | 
						||
| 
								 | 
							
								type. This inside/outside difference is awkward and confusing.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed Resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">The iterator_tag class will be removed, so this is no longer an issue.
							 | 
						||
| 
								 | 
							
								See the resolution to 9.15.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="traversal-concepts-and-tags">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id21" name="traversal-concepts-and-tags">9.20 Traversal Concepts and Tags</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Howard Hinnant pointed out some inconsistencies with the naming of
							 | 
						||
| 
								 | 
							
								these tag types:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								incrementable_iterator_tag // ++r, r++ 
							 | 
						||
| 
								 | 
							
								single_pass_iterator_tag // adds a == b, a != b 
							 | 
						||
| 
								 | 
							
								forward_traversal_iterator_tag // adds multi-pass 
							 | 
						||
| 
								 | 
							
								bidirectional_traversal_iterator_tag // adds --r, r--
							 | 
						||
| 
								 | 
							
								random_access_traversal_iterator_tag // adds r+n,n+r,etc. 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Howard thought that it might be better if all tag names contained
							 | 
						||
| 
								 | 
							
								the word "traversal".  It's not clear that would result in the best
							 | 
						||
| 
								 | 
							
								possible names, though. For example, incrementable iterators can
							 | 
						||
| 
								 | 
							
								only make a single pass over their input. What really distinguishes
							 | 
						||
| 
								 | 
							
								single pass iterators from incrementable iterators is not that they
							 | 
						||
| 
								 | 
							
								can make a single pass, but that they are equality
							 | 
						||
| 
								 | 
							
								comparable. Forward traversal iterators really distinguish
							 | 
						||
| 
								 | 
							
								themselves by introducing multi-pass capability. Without entering
							 | 
						||
| 
								 | 
							
								a "Parkinson's Bicycle Shed" type of discussion, it might be worth
							 | 
						||
| 
								 | 
							
								giving the names of these tags (and the associated concepts) some
							 | 
						||
| 
								 | 
							
								extra attention.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change the names of the traversal tags to the
							 | 
						||
| 
								 | 
							
								following names:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								incrementable_traversal_tag
							 | 
						||
| 
								 | 
							
								single_pass_traversal_tag
							 | 
						||
| 
								 | 
							
								forward_traversal_tag
							 | 
						||
| 
								 | 
							
								bidirectional_traversal_tag
							 | 
						||
| 
								 | 
							
								random_access_traversal_tag
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.traversal]:</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="39%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="24%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">traversal_category<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">incrementable_iterator_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="39%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="24%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">incrementable_traversal_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="33%" />
							 | 
						||
| 
								 | 
							
								<col width="31%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">traversal_category<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">single_pass_iterator_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="33%" />
							 | 
						||
| 
								 | 
							
								<col width="31%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">single_pass_traversal_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="44%" />
							 | 
						||
| 
								 | 
							
								<col width="39%" />
							 | 
						||
| 
								 | 
							
								<col width="17%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">traversal_category<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">forward_traversal_iterator_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="38%" />
							 | 
						||
| 
								 | 
							
								<col width="34%" />
							 | 
						||
| 
								 | 
							
								<col width="27%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">forward_traversal_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="35%" />
							 | 
						||
| 
								 | 
							
								<col width="44%" />
							 | 
						||
| 
								 | 
							
								<col width="21%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">traversal_category<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">bidirectional_traversal_iterator_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="38%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="25%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">bidirectional_traversal_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="31%" />
							 | 
						||
| 
								 | 
							
								<col width="35%" />
							 | 
						||
| 
								 | 
							
								<col width="18%" />
							 | 
						||
| 
								 | 
							
								<col width="16%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">traversal_category<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">random_access_traversal_iterator_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="28%" />
							 | 
						||
| 
								 | 
							
								<col width="30%" />
							 | 
						||
| 
								 | 
							
								<col width="23%" />
							 | 
						||
| 
								 | 
							
								<col width="20%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">random_access_traversal_tag</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.synopsis], change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								struct incrementable_iterator_tag { };
							 | 
						||
| 
								 | 
							
								struct single_pass_iterator_tag : incrementable_iterator_tag { };
							 | 
						||
| 
								 | 
							
								struct forward_traversal_tag : single_pass_iterator_tag { };
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								struct incrementable_traversal_tag { };
							 | 
						||
| 
								 | 
							
								struct single_pass_traversal_tag : incrementable_traversal_tag { };
							 | 
						||
| 
								 | 
							
								struct forward_traversal_tag : single_pass_traversal_tag { };
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Remove:</p>
							 | 
						||
| 
								 | 
							
								<pre class="last literal-block">
							 | 
						||
| 
								 | 
							
								struct null_category_tag { };
							 | 
						||
| 
								 | 
							
								struct input_output_iterator_tag : input_iterator_tag, output_iterator_tag {};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-derived-template-argument-underspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id22" name="iterator-facade-derived-template-argument-underspecified">9.21 iterator_facade Derived template argument underspecified</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The first template argument to iterator_facade is named Derived,
							 | 
						||
| 
								 | 
							
								and the proposal says:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The Derived template parameter must be a class derived from
							 | 
						||
| 
								 | 
							
								iterator_facade.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>First, iterator_facade is a template, so cannot be derived
							 | 
						||
| 
								 | 
							
								from. Rather, the class must be derived from a specialization of
							 | 
						||
| 
								 | 
							
								iterator_facade. More important, isn't Derived required to be the
							 | 
						||
| 
								 | 
							
								class that is being defined? That is, if I understand it right, the
							 | 
						||
| 
								 | 
							
								definition of D here this is not valid:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class C : public iterator_facade<C, ... > { ... }; 
							 | 
						||
| 
								 | 
							
								class D : public iterator_facade<C, ...> { ... }; 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>In the definition of D, the Derived argument to iterator_facade is
							 | 
						||
| 
								 | 
							
								a class derived from a specialization of iterator_facade, so the
							 | 
						||
| 
								 | 
							
								requirement is met. Shouldn't the requirement be more like "when
							 | 
						||
| 
								 | 
							
								using iterator_facade to define an iterator class Iter, the class
							 | 
						||
| 
								 | 
							
								Iter must be derived from a specialization of iterator_facade whose
							 | 
						||
| 
								 | 
							
								first template argument is Iter." That's a bit awkward, but at the
							 | 
						||
| 
								 | 
							
								moment I don't see a better way of phrasing it.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">In [lib.iterator.facade]</p>
							 | 
						||
| 
								 | 
							
								<p>Remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The <tt class="literal"><span class="pre">Derived</span></tt> template parameter must be a class derived from
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The following table describes the other requirements on the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Derived</span></tt> parameter.  Depending on the resulting iterator's
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt>, a subset of the expressions listed in the table
							 | 
						||
| 
								 | 
							
								are required to be valid.  The operations in the first column must be
							 | 
						||
| 
								 | 
							
								accessible to member functions of class <tt class="literal"><span class="pre">iterator_core_access</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The following table describes the typical valid expressions on
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt>'s <tt class="literal"><span class="pre">Derived</span></tt> parameter, depending on the
							 | 
						||
| 
								 | 
							
								iterator concept(s) it will model.  The operations in the first
							 | 
						||
| 
								 | 
							
								column must be made accessible to member functions of class
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_core_access</span></tt>.  In addition,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">static_cast<Derived*>(iterator_facade*)</span></tt> shall be well-formed.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.adaptor]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The <tt class="literal"><span class="pre">iterator_adaptor</span></tt> is a base class template derived from
							 | 
						||
| 
								 | 
							
								an instantiation of <tt class="literal"><span class="pre">iterator_facade</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Each specialization of the <tt class="literal"><span class="pre">iterator_adaptor</span></tt> class template
							 | 
						||
| 
								 | 
							
								is derived from a specialization of <tt class="literal"><span class="pre">iterator_facade</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The <tt class="literal"><span class="pre">Derived</span></tt> template parameter must be a derived class of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_adaptor</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">static_cast<Derived*>(iterator_adaptor*)</span></tt> shall be well-formed.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>[Note: The proposed resolution to Issue 9.37 contains related
							 | 
						||
| 
								 | 
							
								changes]</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="return-type-of-iterator-difference-for-iterator-facade">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id23" name="return-type-of-iterator-difference-for-iterator-facade">9.22 return type of Iterator difference for iterator facade</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The proposal says:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class AC1, class TC1, class R1, class D1, 
							 | 
						||
| 
								 | 
							
								class Dr2, class V2, class AC2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1, Dr2, bool>::type
							 | 
						||
| 
								 | 
							
								operator -(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs, 
							 | 
						||
| 
								 | 
							
								iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs); 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Shouldn't the return type be one of the two iterator types? Which
							 | 
						||
| 
								 | 
							
								one? The idea is that if one of the iterator types can be converted
							 | 
						||
| 
								 | 
							
								to the other type, then the subtraction is okay. Seems like the
							 | 
						||
| 
								 | 
							
								return type should then be the type that was converted to. Is that
							 | 
						||
| 
								 | 
							
								right?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">See resolution to 9.34.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-minor-wording-issue">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id24" name="iterator-facade-minor-wording-issue">9.23 Iterator_facade: minor wording Issue</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>In the table that lists the required (sort of) member functions of
							 | 
						||
| 
								 | 
							
								iterator types that are based on iterator_facade, the entry for
							 | 
						||
| 
								 | 
							
								c.equal(y) says:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								true iff c and y refer to the same position. Implements c == y
							 | 
						||
| 
								 | 
							
								and c != y.  The second sentence is inside out. c.equal(y) does
							 | 
						||
| 
								 | 
							
								not implement either of these operations. It is used to implement
							 | 
						||
| 
								 | 
							
								them. Same thing in the description of c.distance_to(z).</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">remove "implements" descriptions from
							 | 
						||
| 
								 | 
							
								table.  See resolution to 9.34</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="use-of-undefined-name-in-iterator-facade-table">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id25" name="use-of-undefined-name-in-iterator-facade-table">9.24 Use of undefined name in iterator_facade table</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Several of the descriptions use the name X without defining
							 | 
						||
| 
								 | 
							
								it. This seems to be a carryover from the table immediately above
							 | 
						||
| 
								 | 
							
								this section, but the text preceding that table says "In the table
							 | 
						||
| 
								 | 
							
								below, X is the derived iterator type." Looks like the X::
							 | 
						||
| 
								 | 
							
								qualifiers aren't really needed; X::reference can simply be
							 | 
						||
| 
								 | 
							
								reference, since that's defined by the iterator_facade
							 | 
						||
| 
								 | 
							
								specialization itself.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Remove references to X.</p>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.facade] operations <tt class="literal"><span class="pre">operator->()</span> <span class="pre">const;</span></tt>:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">If <tt class="literal"><span class="pre">X::reference</span></tt> is a reference type, an object
							 | 
						||
| 
								 | 
							
								of type <tt class="literal"><span class="pre">X::pointer</span></tt> equal to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								&static_cast<Derived const*>(this)->dereference()
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Otherwise returns an object of unspecified type such that,
							 | 
						||
| 
								 | 
							
								given an object <tt class="literal"><span class="pre">a</span></tt> of type <tt class="literal"><span class="pre">X</span></tt>, <tt class="literal"><span class="pre">a->m</span></tt> is equivalent
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">(w</span> <span class="pre">=</span> <span class="pre">*a,</span> <span class="pre">w.m)</span></tt> for some temporary object <tt class="literal"><span class="pre">w</span></tt> of type
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">X::value_type</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">The type <tt class="literal"><span class="pre">X::pointer</span></tt> is <tt class="literal"><span class="pre">Value*</span></tt> if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">is_writable_iterator<X>::value</span></tt> is <tt class="literal"><span class="pre">true</span></tt>, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Value</span> <span class="pre">const*</span></tt> otherwise.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">If <tt class="literal"><span class="pre">reference</span></tt> is a reference type, an object
							 | 
						||
| 
								 | 
							
								of type <tt class="literal"><span class="pre">pointer</span></tt> equal to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								&static_cast<Derived const*>(this)->dereference()
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p class="last">Otherwise returns an object of unspecified type such that,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">(*static_cast<Derived</span> <span class="pre">const*>(this))->m</span></tt> is equivalent
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">(w</span> <span class="pre">=</span> <span class="pre">**static_cast<Derived</span> <span class="pre">const*>(this),</span> <span class="pre">w.m)</span></tt> for
							 | 
						||
| 
								 | 
							
								some temporary object <tt class="literal"><span class="pre">w</span></tt> of type <tt class="literal"><span class="pre">value_type</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Further changes are covered by issue 9.26.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-wrong-return-type">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id26" name="iterator-facade-wrong-return-type">9.25 Iterator_facade: wrong return type</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>Several of the member functions return a Derived object or a
							 | 
						||
| 
								 | 
							
								Derived&. Their Effects clauses end with:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								return *this;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>This should be</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								return *static_cast<Derived*>(this);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">In [lib.iterator.facade], in the effects clause
							 | 
						||
| 
								 | 
							
								of the following operations:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Derived& operator++()
							 | 
						||
| 
								 | 
							
								Derived& operator--()
							 | 
						||
| 
								 | 
							
								Derived& operator+=(difference_type n)
							 | 
						||
| 
								 | 
							
								Derived& operator-=(difference_type n)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl class="last">
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">return</span> <span class="pre">*this</span></tt></dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">return</span> <span class="pre">*static_cast<Derived*>(this);</span></tt></dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-unclear-returns-clause-for-operator">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id27" name="iterator-facade-unclear-returns-clause-for-operator">9.26 Iterator_facade: unclear returns clause for operator[]</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The returns clause for <tt class="literal"><span class="pre">operator[](difference_type</span> <span class="pre">n)</span></tt> const
							 | 
						||
| 
								 | 
							
								says:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Returns: an object convertible to X::reference and holding a copy
							 | 
						||
| 
								 | 
							
								p of a+n such that, for a constant object v of type
							 | 
						||
| 
								 | 
							
								X::value_type, X::reference(a[n] = v) is equivalent to p = v.
							 | 
						||
| 
								 | 
							
								This needs to define 'a', but assuming it's supposed to be
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">*this</span></tt> (or maybe <tt class="literal"><span class="pre">*(Derived*)this</span></tt>), it still isn't clear
							 | 
						||
| 
								 | 
							
								what this says. Presumably, the idea is that you can index off of
							 | 
						||
| 
								 | 
							
								an iterator and assign to the result. But why the requirement
							 | 
						||
| 
								 | 
							
								that it hold a copy of a+n? Granted, that's probably how it's
							 | 
						||
| 
								 | 
							
								implemented, but it seems over-constrained. And the last phrase
							 | 
						||
| 
								 | 
							
								seems wrong. p is an iterator; there's no requirement that you
							 | 
						||
| 
								 | 
							
								can assign a value_type object to it. Should that be <tt class="literal"><span class="pre">*p</span> <span class="pre">=</span> <span class="pre">v</span></tt>?
							 | 
						||
| 
								 | 
							
								But why the cast in reference(a[n] = v)?</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">In section operator[]:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Writable iterators built with <tt class="literal"><span class="pre">iterator_facade</span></tt> implement
							 | 
						||
| 
								 | 
							
								the semantics required by the preferred resolution to <cite>issue
							 | 
						||
| 
								 | 
							
								299</cite> and adopted by proposal <cite>n1477</cite>: the result of <tt class="literal"><span class="pre">p[n]</span></tt>
							 | 
						||
| 
								 | 
							
								is a proxy object containing a copy of <tt class="literal"><span class="pre">p+n</span></tt>, and <tt class="literal"><span class="pre">p[n]</span> <span class="pre">=</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">x</span></tt> is equivalent to <tt class="literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt>.  This approach will
							 | 
						||
| 
								 | 
							
								work properly for any random-access iterator regardless of
							 | 
						||
| 
								 | 
							
								the other details of its implementation.  A user who knows
							 | 
						||
| 
								 | 
							
								more about the implementation of her iterator is free to
							 | 
						||
| 
								 | 
							
								implement an <tt class="literal"><span class="pre">operator[]</span></tt> which returns an lvalue in the
							 | 
						||
| 
								 | 
							
								derived iterator class; it will hide the one supplied by
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt> from clients of her iterator.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								Writable iterators built with <tt class="literal"><span class="pre">iterator_facade</span></tt> implement
							 | 
						||
| 
								 | 
							
								the semantics required by the preferred resolution to <cite>issue
							 | 
						||
| 
								 | 
							
								299</cite> and adopted by proposal <cite>n1550</cite>: the result of <tt class="literal"><span class="pre">p[n]</span></tt>
							 | 
						||
| 
								 | 
							
								is an object convertible to the iterator's <tt class="literal"><span class="pre">value_type</span></tt>,
							 | 
						||
| 
								 | 
							
								and <tt class="literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is equivalent to <tt class="literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note:
							 | 
						||
| 
								 | 
							
								This result object may be implemented as a proxy containing a
							 | 
						||
| 
								 | 
							
								copy of <tt class="literal"><span class="pre">p+n</span></tt>).  This approach will work properly for any
							 | 
						||
| 
								 | 
							
								random-access iterator regardless of the other details of its
							 | 
						||
| 
								 | 
							
								implementation.  A user who knows more about the
							 | 
						||
| 
								 | 
							
								implementation of her iterator is free to implement an
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator[]</span></tt> that returns an lvalue in the derived iterator
							 | 
						||
| 
								 | 
							
								class; it will hide the one supplied by <tt class="literal"><span class="pre">iterator_facade</span></tt>
							 | 
						||
| 
								 | 
							
								from clients of her iterator.</blockquote>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.facade] operations:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">an object convertible to <tt class="literal"><span class="pre">X::reference</span></tt> and
							 | 
						||
| 
								 | 
							
								holding a copy <em>p</em> of <tt class="literal"><span class="pre">a+n</span></tt> such that, for a constant
							 | 
						||
| 
								 | 
							
								object <tt class="literal"><span class="pre">v</span></tt> of type <tt class="literal"><span class="pre">X::value_type</span></tt>, <tt class="literal"><span class="pre">X::reference(a[n]</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">=</span> <span class="pre">v)</span></tt> is equivalent to <tt class="literal"><span class="pre">p</span> <span class="pre">=</span> <span class="pre">v</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">an object convertible to <tt class="literal"><span class="pre">value_type</span></tt>. For
							 | 
						||
| 
								 | 
							
								constant objects <tt class="literal"><span class="pre">v</span></tt> of type <tt class="literal"><span class="pre">value_type</span></tt>, and <tt class="literal"><span class="pre">n</span></tt> of
							 | 
						||
| 
								 | 
							
								type <tt class="literal"><span class="pre">difference_type</span></tt>, <tt class="literal"><span class="pre">(*this)[n]</span> <span class="pre">=</span> <span class="pre">v</span></tt> is equivalent
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">*(*this</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">v</span></tt>, and <tt class="literal"><span class="pre">static_cast<value_type</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">const&>((*this)[n])</span></tt> is equivalent to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">static_cast<value_type</span> <span class="pre">const&>(*(*this</span> <span class="pre">+</span> <span class="pre">n))</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-redundant-clause">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id28" name="iterator-facade-redundant-clause">9.27 Iterator_facade: redundant clause</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">operator-</span></tt> has both an effects clause and a returns
							 | 
						||
| 
								 | 
							
								clause. Looks like the returns clause should be removed.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Remove the returns clause.</p>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.facade] operations:</p>
							 | 
						||
| 
								 | 
							
								<dl class="last">
							 | 
						||
| 
								 | 
							
								<dt>Remove:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">static_cast<Derived</span> <span class="pre">const*>(this)->advance(-n);</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="indirect-iterator-incorrect-specification-of-default-constructor">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id29" name="indirect-iterator-incorrect-specification-of-default-constructor">9.28 indirect_iterator: incorrect specification of default constructor</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The default constructor returns "An instance of indirect_iterator
							 | 
						||
| 
								 | 
							
								with a default constructed base object", but the constructor that
							 | 
						||
| 
								 | 
							
								takes an Iterator object returns "An instance of indirect_iterator
							 | 
						||
| 
								 | 
							
								with the iterator_adaptor subobject copy constructed from x." The
							 | 
						||
| 
								 | 
							
								latter is the correct form, since it does not reach inside the base
							 | 
						||
| 
								 | 
							
								class for its semantics. So the default constructor shoudl return
							 | 
						||
| 
								 | 
							
								"An instance of indirect_iterator with a default-constructed
							 | 
						||
| 
								 | 
							
								iterator_adaptor subobject."</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><dl class="first last">
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
							 | 
						||
| 
								 | 
							
								a default constructed base object.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
							 | 
						||
| 
								 | 
							
								a default-constructed <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">Inheritance from iterator_adaptor has been removed, so we instead
							 | 
						||
| 
								 | 
							
								give the semantics in terms of the (exposition only) member
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="indirect-iterator-unclear-specification-of-template-constructor">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id30" name="indirect-iterator-unclear-specification-of-template-constructor">9.29 indirect_iterator: unclear specification of template constructor</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The templated constructor that takes an indirect_iterator with a
							 | 
						||
| 
								 | 
							
								different set of template arguments says that it returns "An
							 | 
						||
| 
								 | 
							
								instance of indirect_iterator that is a copy of [the argument]".
							 | 
						||
| 
								 | 
							
								But the type of the argument is different from the type of the
							 | 
						||
| 
								 | 
							
								object being constructed, and there is no description of what
							 | 
						||
| 
								 | 
							
								a "copy" means. The Iterator template parameter for the argument
							 | 
						||
| 
								 | 
							
								must be convertible to the Iterator template parameter for the type
							 | 
						||
| 
								 | 
							
								being constructed, which suggests that the argument's contained
							 | 
						||
| 
								 | 
							
								Iterator object should be converted to the target type's Iterator
							 | 
						||
| 
								 | 
							
								type.  Is that what's meant here?
							 | 
						||
| 
								 | 
							
								(Pete later writes: In fact, this problem is present in all of the
							 | 
						||
| 
								 | 
							
								specialized adaptors that have a constructor like this: the
							 | 
						||
| 
								 | 
							
								constructor returns "a copy" of the argument without saying what a
							 | 
						||
| 
								 | 
							
								copy is.)</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><dl class="first last">
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> that is a copy of <tt class="literal"><span class="pre">y</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> whose 
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt> subobject is constructed from <tt class="literal"><span class="pre">y.base()</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">Inheritance from iterator_adaptor has been removed, so we
							 | 
						||
| 
								 | 
							
								instead give the semantics in terms of the member <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="transform-iterator-argument-irregularity">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id31" name="transform-iterator-argument-irregularity">9.30 transform_iterator argument irregularity</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>The specialized adaptors that take both a Value and a Reference
							 | 
						||
| 
								 | 
							
								template argument all take them in that order, i.e. Value precedes
							 | 
						||
| 
								 | 
							
								Reference in the template argument list, with the exception of
							 | 
						||
| 
								 | 
							
								transform_iterator, where Reference precedes Value. This seems like
							 | 
						||
| 
								 | 
							
								a possible source of confusion. Is there a reason why this order is
							 | 
						||
| 
								 | 
							
								preferable?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">NAD</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">defaults for Value depend on Reference.  A sensible
							 | 
						||
| 
								 | 
							
								Value can almost always be computed from Reference.  The first
							 | 
						||
| 
								 | 
							
								parameter is UnaryFunction, so the argument order is already
							 | 
						||
| 
								 | 
							
								different from the other adapters.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="function-output-iterator-overconstrained">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id32" name="function-output-iterator-overconstrained">9.31 function_output_iterator overconstrained</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>function_output_iterator requirements says: "The UnaryFunction must
							 | 
						||
| 
								 | 
							
								be Assignable, Copy Constructible, and the expression f(x) must be
							 | 
						||
| 
								 | 
							
								valid, where f is an object of type UnaryFunction and x is an
							 | 
						||
| 
								 | 
							
								object of a type accepted by f."</p>
							 | 
						||
| 
								 | 
							
								<p>Everything starting with "and," somewhat reworded, is actually a
							 | 
						||
| 
								 | 
							
								constraint on output_proxy::operator=. All that's needed to create
							 | 
						||
| 
								 | 
							
								a function_output_iterator object is that the UnaryFunction type be
							 | 
						||
| 
								 | 
							
								Assignable and CopyConstructible. That's also sufficient to
							 | 
						||
| 
								 | 
							
								dereference and to increment such an object. It's only when you try
							 | 
						||
| 
								 | 
							
								to assign through a dereferenced iterator that f(x) has to work,
							 | 
						||
| 
								 | 
							
								and then only for the particular function object that the iterator
							 | 
						||
| 
								 | 
							
								holds and for the particular value that is being assigned.</p>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Addition from Jeremy:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The constructor for <tt class="literal"><span class="pre">function_output_iterator</span></tt> is also
							 | 
						||
| 
								 | 
							
								slightly overconstrained because it requires 
							 | 
						||
| 
								 | 
							
								the <tt class="literal"><span class="pre">UnaryFunction</span></tt> to have a default constructor
							 | 
						||
| 
								 | 
							
								even when the default constructor of <tt class="literal"><span class="pre">function_output_iterator</span></tt>
							 | 
						||
| 
								 | 
							
								is not used.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><dl class="first">
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">output_proxy</span> <span class="pre">operator*();</span></tt></dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">/*</span> <span class="pre">see</span> <span class="pre">below</span> <span class="pre">*/</span> <span class="pre">operator*();</span></tt></dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>After <tt class="literal"><span class="pre">function_output_iterator&</span> <span class="pre">operator++(int);</span></tt> add:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  UnaryFunction m_f;     // exposition only
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">UnaryFunction</span></tt> must be Assignable, Copy Constructible,
							 | 
						||
| 
								 | 
							
								and the expression <tt class="literal"><span class="pre">f(x)</span></tt> must be valid, where <tt class="literal"><span class="pre">f</span></tt> is an
							 | 
						||
| 
								 | 
							
								object of type <tt class="literal"><span class="pre">UnaryFunction</span></tt> and <tt class="literal"><span class="pre">x</span></tt> is an object of a
							 | 
						||
| 
								 | 
							
								type accepted by <tt class="literal"><span class="pre">f</span></tt>.  The resulting
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">function_output_iterator</span></tt> is a model of the Writable and
							 | 
						||
| 
								 | 
							
								Incrementable Iterator concepts.</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">UnaryFunction</span></tt> must be Assignable and Copy Constructible.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p class="last">After the requirements section, add:</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">function_output_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">function_output_iterator</span></tt> is a model of the Writable and
							 | 
						||
| 
								 | 
							
								Incrementable Iterator concepts.</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">function_output_iterator</span></tt> with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">f</span></tt> stored as a data member.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">function_output_iterator</span></tt> 
							 | 
						||
| 
								 | 
							
								with <tt class="literal"><span class="pre">m_f</span></tt> constructed from <tt class="literal"><span class="pre">f</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><tt class="literal"><span class="pre">output_proxy</span> <span class="pre">operator*();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">output_proxy</span></tt> constructed with
							 | 
						||
| 
								 | 
							
								a copy of the unary function <tt class="literal"><span class="pre">f</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><tt class="literal"><span class="pre">operator*();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An object <tt class="literal"><span class="pre">r</span></tt> of unspecified type such that <tt class="literal"><span class="pre">r</span> <span class="pre">=</span> <span class="pre">t</span></tt>
							 | 
						||
| 
								 | 
							
								is equivalent to <tt class="literal"><span class="pre">m_f(t)</span></tt> for all <tt class="literal"><span class="pre">t</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Remove:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><tt class="literal"><span class="pre">function_output_iterator::output_proxy</span></tt> operations</p>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">output_proxy(UnaryFunction&</span> <span class="pre">f);</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">output_proxy</span></tt> with <tt class="literal"><span class="pre">f</span></tt> stored as
							 | 
						||
| 
								 | 
							
								a data member.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span> <span class="pre">output_proxy&</span> <span class="pre">operator=(const</span> <span class="pre">T&</span> <span class="pre">value);</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><pre class="first last literal-block">
							 | 
						||
| 
								 | 
							
								m_f(value); 
							 | 
						||
| 
								 | 
							
								return *this; 
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								explicit function_output_iterator();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								explicit function_output_iterator(const UnaryFunction& f);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="should-output-proxy-really-be-a-named-type">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id33" name="should-output-proxy-really-be-a-named-type">9.32 Should output_proxy really be a named type?</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>This means someone can store an output_proxy object for later use,
							 | 
						||
| 
								 | 
							
								whatever that means. It also constrains output_proxy to hold a copy
							 | 
						||
| 
								 | 
							
								of the function object, rather than a pointer to the iterator
							 | 
						||
| 
								 | 
							
								object. Is all this mechanism really necessary?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">See issue 9.31.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="istreambuf-iterator-isn-t-a-readable-iterator">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id34" name="istreambuf-iterator-isn-t-a-readable-iterator">9.33 istreambuf_iterator isn't a Readable Iterator</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12333:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								N1550 requires that for a Readable Iterator a of type X, <tt class="literal"><span class="pre">*a</span></tt>
							 | 
						||
| 
								 | 
							
								returns an object of type
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt>. <tt class="literal"><span class="pre">istreambuf_iterator::operator*</span></tt>
							 | 
						||
| 
								 | 
							
								returns <tt class="literal"><span class="pre">charT</span></tt>, but <tt class="literal"><span class="pre">istreambuf_iterator::reference</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">charT&</span></tt>. So am I overlooking something, or is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">istreambuf_iterator</span></tt> not Readable.</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Remove all constraints on
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt> in Readable Iterator and Lvalue
							 | 
						||
| 
								 | 
							
								Iterator. Change Lvalue Iterator to refer to <tt class="literal"><span class="pre">T&</span></tt> instead of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Readable Iterator</em>
							 | 
						||
| 
								 | 
							
								concept for the value type <tt class="literal"><span class="pre">T</span></tt> if the following expressions
							 | 
						||
| 
								 | 
							
								are valid and respect the stated semantics. <tt class="literal"><span class="pre">U</span></tt> is the type
							 | 
						||
| 
								 | 
							
								of any specified member of type <tt class="literal"><span class="pre">T</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Readable Iterator</em>
							 | 
						||
| 
								 | 
							
								concept for value type <tt class="literal"><span class="pre">T</span></tt> if, in addition to <tt class="literal"><span class="pre">X</span></tt> being
							 | 
						||
| 
								 | 
							
								Assignable and Copy Constructible, the following expressions
							 | 
						||
| 
								 | 
							
								are valid and respect the stated semantics. <tt class="literal"><span class="pre">U</span></tt> is the type
							 | 
						||
| 
								 | 
							
								of any specified member of type <tt class="literal"><span class="pre">T</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>From the Input Iterator Requirements table, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="37%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">*a</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>pre: <tt class="literal"><span class="pre">a</span></tt> is
							 | 
						||
| 
								 | 
							
								dereferenceable. If <tt class="literal"><span class="pre">a</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="literal"><span class="pre">*a</span></tt> is
							 | 
						||
| 
								 | 
							
								equivalent to <tt class="literal"><span class="pre">*b</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="28%" />
							 | 
						||
| 
								 | 
							
								<col width="20%" />
							 | 
						||
| 
								 | 
							
								<col width="52%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">*a</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Convertible to <tt class="literal"><span class="pre">T</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><dl class="first last">
							 | 
						||
| 
								 | 
							
								<dt>pre: <tt class="literal"><span class="pre">a</span></tt> is dereferenceable. If <tt class="literal"><span class="pre">a</span> <span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="literal"><span class="pre">*a</span></tt></dt>
							 | 
						||
| 
								 | 
							
								<dd>is equivalent to <tt class="literal"><span class="pre">*b</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <em>Lvalue Iterator</em> concept adds the requirement that the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">reference</span></tt> type be a reference to the value type of the
							 | 
						||
| 
								 | 
							
								iterator.</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <em>Lvalue Iterator</em> concept adds the requirement that the
							 | 
						||
| 
								 | 
							
								return type of <tt class="literal"><span class="pre">operator*</span></tt> type be a reference to the value
							 | 
						||
| 
								 | 
							
								type of the iterator.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="42%" />
							 | 
						||
| 
								 | 
							
								<col width="14%" />
							 | 
						||
| 
								 | 
							
								<col width="44%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th colspan="3">Lvalue Iterator Requirements</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Assertion</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">iterator_traits<X>::reference</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">T&</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">T</span></tt> is <em>cv</em>
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt>
							 | 
						||
| 
								 | 
							
								where <em>cv</em> is an optional
							 | 
						||
| 
								 | 
							
								cv-qualification</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="22%" />
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="59%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th colspan="3">Lvalue Iterator Requirements</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Note/Assertion</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">*a</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">T&</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">T</span></tt> is <em>cv</em>
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt>
							 | 
						||
| 
								 | 
							
								where <em>cv</em> is an optional
							 | 
						||
| 
								 | 
							
								cv-qualification.
							 | 
						||
| 
								 | 
							
								pre: <tt class="literal"><span class="pre">a</span></tt> is
							 | 
						||
| 
								 | 
							
								dereferenceable. If <tt class="literal"><span class="pre">a</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="literal"><span class="pre">*a</span></tt> is
							 | 
						||
| 
								 | 
							
								equivalent to <tt class="literal"><span class="pre">*b</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p class="last">At the end of the section reverse_iterator models, add:
							 | 
						||
| 
								 | 
							
								The type <tt class="literal"><span class="pre">iterator_traits<Iterator>::reference</span></tt> must be the type of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">*i</span></tt>, where <tt class="literal"><span class="pre">i</span></tt> is an object of type <tt class="literal"><span class="pre">Iterator</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body"><p class="first">Ideally there should be requirements on the reference
							 | 
						||
| 
								 | 
							
								type, however, since Readable Iterator is suppose to correspond
							 | 
						||
| 
								 | 
							
								to the current standard iterator requirements (which do not place
							 | 
						||
| 
								 | 
							
								requirements on the reference type) we will leave them off for
							 | 
						||
| 
								 | 
							
								now.  There is a DR in process with respect to the reference type
							 | 
						||
| 
								 | 
							
								in the stadard iterator requirements. Once that is resolved we
							 | 
						||
| 
								 | 
							
								will revisit this issue for Readable Iterator and Lvalue
							 | 
						||
| 
								 | 
							
								Iterator.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">We added Assignable to the requirements for Readable
							 | 
						||
| 
								 | 
							
								Iterator. This is needed to have Readable Iterator coincide with
							 | 
						||
| 
								 | 
							
								the capabilities of Input Iterator.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-free-functions-unspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id35" name="iterator-facade-free-functions-unspecified">9.34 iterator_facade free functions unspecified</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12562:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The template functions <tt class="literal"><span class="pre">operator==</span></tt>, <tt class="literal"><span class="pre">operator!=</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator<</span></tt>, <tt class="literal"><span class="pre">operator<=</span></tt>, <tt class="literal"><span class="pre">operator></span></tt>, <tt class="literal"><span class="pre">operator>=</span></tt>, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator-</span></tt> that take two arguments that are specializations of
							 | 
						||
| 
								 | 
							
								iterator_facade have no specification. The template function
							 | 
						||
| 
								 | 
							
								operator+ that takes an argument that is a specialization of
							 | 
						||
| 
								 | 
							
								iterator_facade and an argument of type difference_type has no
							 | 
						||
| 
								 | 
							
								specification.</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Add the missing specifications.</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr, class V, class TC, class R, class D>
							 | 
						||
| 
								 | 
							
								Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
							 | 
						||
| 
								 | 
							
								                   typename Derived::difference_type n);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dr, class V, class TC, class R, class D>
							 | 
						||
| 
								 | 
							
								Derived operator+ (typename Derived::difference_type n,
							 | 
						||
| 
								 | 
							
								                   iterator_facade<Dr,V,TC,R,D> const&);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><pre class="first last literal-block">
							 | 
						||
| 
								 | 
							
								Derived tmp(static_cast<Derived const*>(this));
							 | 
						||
| 
								 | 
							
								return tmp += n;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">lhs.equal(rhs)</span></tt>.  Otherwise, <tt class="literal"><span class="pre">rhs.equal(lhs)</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">!lhs.equal(rhs)</span></tt>.  Otherwise, <tt class="literal"><span class="pre">!rhs.equal(lhs)</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">lhs.distance_to(rhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>. Otherwise, <tt class="literal"><span class="pre">rhs.distance_to(lhs)</span> <span class="pre">></span>
							 | 
						||
| 
								 | 
							
								<span class="pre">0</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">lhs.distance_to(rhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>. Otherwise, <tt class="literal"><span class="pre">rhs.distance_to(lhs)</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">>=</span> <span class="pre">0</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">lhs.distance_to(rhs)</span> <span class="pre">></span> <span class="pre">0</span></tt>. Otherwise,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">rhs.distance_to(lhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,bool>::type
							 | 
						||
| 
								 | 
							
								operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">lhs.distance_to(rhs)</span> <span class="pre">>=</span> <span class="pre">0</span></tt>. Otherwise,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">rhs.distance_to(lhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dr1, class V1, class TC1, class R1, class D1,
							 | 
						||
| 
								 | 
							
								          class Dr2, class V2, class TC2, class R2, class D2>
							 | 
						||
| 
								 | 
							
								typename enable_if_interoperable<Dr1,Dr2,difference>::type
							 | 
						||
| 
								 | 
							
								operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
							 | 
						||
| 
								 | 
							
								           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Return Type:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">difference</span></tt> shall be
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Dr1>::difference_type</span></tt>.  Otherwise,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">difference</span></tt> shall be
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Dr2>::difference_type</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">if <tt class="literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">-lhs.distance_to(rhs)</span></tt>. Otherwise,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">rhs.distance_to(lhs)</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-too-many-equals">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id36" name="iterator-facade-too-many-equals">9.35 iterator_facade: too many equals?</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12563:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The table listing the functions required for types derived from
							 | 
						||
| 
								 | 
							
								iterator_facade has two functions named equal and two named
							 | 
						||
| 
								 | 
							
								distance_to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								c.equal(b)
							 | 
						||
| 
								 | 
							
								c.equal(y)
							 | 
						||
| 
								 | 
							
								c.distance_to(b)
							 | 
						||
| 
								 | 
							
								c.distance_to(z)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>where b and c are const objects of the derived type, y and z are
							 | 
						||
| 
								 | 
							
								constant objects of certain iterator types that are interoperable
							 | 
						||
| 
								 | 
							
								with the derived type.  Seems like the 'b' versions are
							 | 
						||
| 
								 | 
							
								redundant: in both cases, the other version will take a 'b'. In
							 | 
						||
| 
								 | 
							
								fact, iterator_adaptor is specified to use iterator_facade, but
							 | 
						||
| 
								 | 
							
								does not provide the 'b' versions of these functions.</p>
							 | 
						||
| 
								 | 
							
								<p>Are the 'b' versions needed?</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Remove the 'b' versions.</p>
							 | 
						||
| 
								 | 
							
								<p>In <tt class="literal"><span class="pre">iterator_facade</span></tt> requirements, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="18%" />
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.equal(b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to bool</td>
							 | 
						||
| 
								 | 
							
								<td>true iff <tt class="literal"><span class="pre">b</span></tt> and <tt class="literal"><span class="pre">c</span></tt> are
							 | 
						||
| 
								 | 
							
								equivalent.</td>
							 | 
						||
| 
								 | 
							
								<td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>and remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="18%" />
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								X::difference_type</td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to <tt class="literal"><span class="pre">distance(c,</span> <span class="pre">b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="iterator-facade-function-requirements">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id37" name="iterator-facade-function-requirements">9.36 iterator_facade function requirements</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12636:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The table that lists required functions for the derived type X
							 | 
						||
| 
								 | 
							
								passed to iterator_facade lists, among others:</p>
							 | 
						||
| 
								 | 
							
								<p>for a single pass iterator:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								c.equal(b)
							 | 
						||
| 
								 | 
							
								c.equal(y)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>where b and c are const X objects, and y is a const object of a
							 | 
						||
| 
								 | 
							
								single pass iterator that is interoperable with X. Since X is
							 | 
						||
| 
								 | 
							
								interoperable with itself, c.equal(b) is redundant. There is a
							 | 
						||
| 
								 | 
							
								difference in their descriptions, but its meaning isn't
							 | 
						||
| 
								 | 
							
								clear. The first is "true iff b and c are equivalent", and the
							 | 
						||
| 
								 | 
							
								second is "true iff c and y refer to the same position." Is there
							 | 
						||
| 
								 | 
							
								a difference between the undefined term "equivalent" and "refer
							 | 
						||
| 
								 | 
							
								to the same position"?</p>
							 | 
						||
| 
								 | 
							
								<p>Similarly, for a random access traversal iterator:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								c.distance_to(b)
							 | 
						||
| 
								 | 
							
								c.distance_to(z)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>where z is a constant object of a random access traversal
							 | 
						||
| 
								 | 
							
								iterator that is interoperable with X.  Again, X is interoperable
							 | 
						||
| 
								 | 
							
								with itself, so c.distance_to(b) is redundant.  Also, the
							 | 
						||
| 
								 | 
							
								specification for c.distance_to(z) isn't valid. It's written
							 | 
						||
| 
								 | 
							
								as "equivalent to distance(c, z)". The template function distance
							 | 
						||
| 
								 | 
							
								takes two arguments of the same type, so distance(c, z) isn't
							 | 
						||
| 
								 | 
							
								valid if c and z are different types. Should it be
							 | 
						||
| 
								 | 
							
								distance(c, (X)z)?</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Removed the 'b' versions (see 9.35) and added the cast.</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="18%" />
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(z)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								X::difference_type</td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to <tt class="literal"><span class="pre">distance(c,</span> <span class="pre">z)</span></tt>.
							 | 
						||
| 
								 | 
							
								Implements <tt class="literal"><span class="pre">c</span> <span class="pre">-</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span> <span class="pre"><</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span>
							 | 
						||
| 
								 | 
							
								<span class="pre"><=</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span> <span class="pre">></span> <span class="pre">z</span></tt>, and <tt class="literal"><span class="pre">c</span> <span class="pre">>=</span> <span class="pre">c</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="21%" />
							 | 
						||
| 
								 | 
							
								<col width="23%" />
							 | 
						||
| 
								 | 
							
								<col width="27%" />
							 | 
						||
| 
								 | 
							
								<col width="29%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(z)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">F::difference_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">distance(c,</span> <span class="pre">X(z))</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="more-issues-not-from-matt-s-list">
							 | 
						||
| 
								 | 
							
								<h1><a class="toc-backref" href="#id38" name="more-issues-not-from-matt-s-list">More Issues (not from Matt's list)</a></h1>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-inheritance-in-iterator-adaptor-and-other-adaptors-is-an-overspecification">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id39" name="x-inheritance-in-iterator-adaptor-and-other-adaptors-is-an-overspecification">9.37x Inheritance in iterator_adaptor and other adaptors is an overspecification</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12696:
							 | 
						||
| 
								 | 
							
								The paper requires that iterator_adaptor be derived from an
							 | 
						||
| 
								 | 
							
								appropriate instance of iterator_facade, and that most of the specific
							 | 
						||
| 
								 | 
							
								forms of adaptors be derived from appropriate instances of
							 | 
						||
| 
								 | 
							
								iterator_adaptor. That seems like overspecification, and we ought to
							 | 
						||
| 
								 | 
							
								look at specifying these things in terms of what the various templates
							 | 
						||
| 
								 | 
							
								provide rather than how they're implemented.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Remove the specfication of inheritance, and add explicit
							 | 
						||
| 
								 | 
							
								specification of all the functionality that was inherited from the
							 | 
						||
| 
								 | 
							
								specialized iterators.</p>
							 | 
						||
| 
								 | 
							
								<p>In iterator_adaptor, inheritance is retained, sorry NAD.  Also,
							 | 
						||
| 
								 | 
							
								the Interoperable Iterators concept is added to the new iterator
							 | 
						||
| 
								 | 
							
								concepts, and this concept is used in the specification of the
							 | 
						||
| 
								 | 
							
								iterator adaptors.</p>
							 | 
						||
| 
								 | 
							
								<p>In n1550, after [lib.random.access.traversal.iterators], add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>Interoperable Iterators [lib.interoperable.iterators]</p>
							 | 
						||
| 
								 | 
							
								<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> that models Single Pass Iterator
							 | 
						||
| 
								 | 
							
								is <em>interoperable with</em> a class or built-in type <tt class="literal"><span class="pre">Y</span></tt> that
							 | 
						||
| 
								 | 
							
								also models Single Pass Iterator if the following expressions
							 | 
						||
| 
								 | 
							
								are valid and respect the stated semantics. In the tables
							 | 
						||
| 
								 | 
							
								below, <tt class="literal"><span class="pre">x</span></tt> is an object of type <tt class="literal"><span class="pre">X</span></tt>, <tt class="literal"><span class="pre">y</span></tt> is an object of
							 | 
						||
| 
								 | 
							
								type <tt class="literal"><span class="pre">Y</span></tt>, <tt class="literal"><span class="pre">Distance</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Y>::difference_type</span></tt>, and <tt class="literal"><span class="pre">n</span></tt> represents a
							 | 
						||
| 
								 | 
							
								constant object of type <tt class="literal"><span class="pre">Distance</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="13%" />
							 | 
						||
| 
								 | 
							
								<col width="27%" />
							 | 
						||
| 
								 | 
							
								<col width="60%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Assertion/Precondition/Postcondition</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">=</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">Y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>post: <tt class="literal"><span class="pre">y</span> <span class="pre">==</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">Y(x)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">Y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>post: <tt class="literal"><span class="pre">Y(x)</span> <span class="pre">==</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">==</span></tt> is an equivalence relation over its domain.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">==</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">==</span></tt> is an equivalence relation over its domain.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre">!=</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">bool(a==b)</span> <span class="pre">!=</span> <span class="pre">bool(a!=b)</span></tt> over its domain.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">!=</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">bool(a==b)</span> <span class="pre">!=</span> <span class="pre">bool(a!=b)</span></tt> over its domain.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>If <tt class="literal"><span class="pre">X</span></tt> and <tt class="literal"><span class="pre">Y</span></tt> both model Random Access Traversal Iterator then
							 | 
						||
| 
								 | 
							
								the following additional requirements must be met.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="12%" />
							 | 
						||
| 
								 | 
							
								<col width="25%" />
							 | 
						||
| 
								 | 
							
								<col width="23%" />
							 | 
						||
| 
								 | 
							
								<col width="41%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Operational Semantics</th>
							 | 
						||
| 
								 | 
							
								<th>Assertion/ Precondition</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre"><</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">y</span> <span class="pre">-</span> <span class="pre">x</span> <span class="pre">></span> <span class="pre">0</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre"><</span></tt> is a total ordering relation</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre"><</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">x</span> <span class="pre">-</span> <span class="pre">y</span> <span class="pre">></span> <span class="pre">0</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre"><</span></tt> is a total ordering relation</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre">></span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">y</span> <span class="pre"><</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">></span></tt> is a total ordering relation</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">></span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">x</span> <span class="pre"><</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">></span></tt> is a total ordering relation</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre">>=</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">!(x</span> <span class="pre"><</span> <span class="pre">y)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">>=</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">!(y</span> <span class="pre"><</span> <span class="pre">x)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre"><=</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">!(x</span> <span class="pre">></span> <span class="pre">y)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre"><=</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">!(y</span> <span class="pre">></span> <span class="pre">x)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">y</span> <span class="pre">-</span> <span class="pre">x</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">Distance</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">distance(Y(x),y)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>pre: there exists a value <tt class="literal"><span class="pre">n</span></tt> of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Distance</span></tt> such that <tt class="literal"><span class="pre">x</span> <span class="pre">+</span> <span class="pre">n</span> <span class="pre">==</span> <span class="pre">y</span></tt>.
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">y</span> <span class="pre">==</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">(y</span> <span class="pre">-</span> <span class="pre">x)</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">x</span> <span class="pre">-</span> <span class="pre">y</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">Distance</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">distance(y,Y(x))</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>pre: there exists a value <tt class="literal"><span class="pre">n</span></tt> of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Distance</span></tt> such that <tt class="literal"><span class="pre">y</span> <span class="pre">+</span> <span class="pre">n</span> <span class="pre">==</span> <span class="pre">x</span></tt>.
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">y</span> <span class="pre">+</span> <span class="pre">(x</span> <span class="pre">-</span> <span class="pre">y)</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In N1530:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.adaptor]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class iterator_adaptor 
							 | 
						||
| 
								 | 
							
								  : public iterator_facade<Derived, /* see details ...*/>
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>To:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class iterator_adaptor 
							 | 
						||
| 
								 | 
							
								  : public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change the text from:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">Base</span></tt> type must implement the expressions involving
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt> in the specifications...</dd>
							 | 
						||
| 
								 | 
							
								<dt>until the end of the <strong>iterator_adaptor requirements</strong> section, to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">Base</span></tt> argument shall be Assignable and Copy Constructible.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>Add:</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <em>V'</em>, <em>C'</em>, <em>R'</em>, and <em>D'</em> parameters of the <tt class="literal"><span class="pre">iterator_facade</span></tt>
							 | 
						||
| 
								 | 
							
								used as a base class in the summary of <tt class="literal"><span class="pre">iterator_adaptor</span></tt>
							 | 
						||
| 
								 | 
							
								above are defined as follows:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								<em>V'</em> = if (Value is use_default)
							 | 
						||
| 
								 | 
							
								          return iterator_traits<Base>::value_type
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								          return Value
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<em>C'</em> = if (CategoryOrTraversal is use_default)
							 | 
						||
| 
								 | 
							
								          return iterator_traversal<Base>::type
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								          return CategoryOrTraversal
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<em>R'</em> = if (Reference is use_default)
							 | 
						||
| 
								 | 
							
								          if (Value is use_default)
							 | 
						||
| 
								 | 
							
								              return iterator_traits<Base>::reference
							 | 
						||
| 
								 | 
							
								          else
							 | 
						||
| 
								 | 
							
								              return Value&
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								          return Reference
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<em>D'</em> = if (Difference is use_default)
							 | 
						||
| 
								 | 
							
								          return iterator_traits<Base>::difference_type
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								          return Difference
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.special.adaptors]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class indirect_iterator
							 | 
						||
| 
								 | 
							
								  : public iterator_adaptor</* see discussion */>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    friend class iterator_core_access;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class indirect_iterator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ value_type;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ reference;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ pointer;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ difference_type;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private: // as-if specification
							 | 
						||
| 
								 | 
							
								    typename indirect_iterator::reference dereference() const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return **this->base();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								    Iterator const& base() const;
							 | 
						||
| 
								 | 
							
								    reference operator*() const;
							 | 
						||
| 
								 | 
							
								    indirect_iterator& operator++();
							 | 
						||
| 
								 | 
							
								    indirect_iterator& operator--();
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								   Iterator m_iterator; // exposition
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>After the synopsis add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The member types of <tt class="literal"><span class="pre">indirect_iterator</span></tt> are defined
							 | 
						||
| 
								 | 
							
								according to the following pseudo-code, where <tt class="literal"><span class="pre">V</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt></p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if (Value is use_default) then
							 | 
						||
| 
								 | 
							
								    typedef remove_const<pointee<V>::type>::type value_type;
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    typedef remove_const<Value>::type value_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Reference is use_default) then
							 | 
						||
| 
								 | 
							
								    if (Value is use_default) then
							 | 
						||
| 
								 | 
							
								        typedef indirect_reference<V>::type reference;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        typedef Value& reference;
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    typedef Reference reference;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Value is use_default) then 
							 | 
						||
| 
								 | 
							
								    typedef pointee<V>::type* pointer;
							 | 
						||
| 
								 | 
							
								else 
							 | 
						||
| 
								 | 
							
								    typedef Value* pointer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Difference is use_default)
							 | 
						||
| 
								 | 
							
								    typedef iterator_traits<Iterator>::difference_type difference_type;
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    typedef Difference difference_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (CategoryOrTraversal is use_default)
							 | 
						||
| 
								 | 
							
								    typedef <em>iterator-category</em>(
							 | 
						||
| 
								 | 
							
								        iterator_traversal<Iterator>::type,``reference``,``value_type``
							 | 
						||
| 
								 | 
							
								    ) iterator_category;
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    typedef <em>iterator-category</em>(
							 | 
						||
| 
								 | 
							
								        CategoryOrTraversal,``reference``,``value_type``
							 | 
						||
| 
								 | 
							
								    ) iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>[Note: See resolution to 9.44y for a description of <tt class="literal"><span class="pre">pointee</span></tt> and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_reference</span></tt>]</p>
							 | 
						||
| 
								 | 
							
								<p>After the requirements section, add:</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">indirect_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>In addition to the concepts indicated by <tt class="literal"><span class="pre">iterator_category</span></tt>
							 | 
						||
| 
								 | 
							
								and by <tt class="literal"><span class="pre">iterator_traversal<indirect_iterator>::type</span></tt>, a
							 | 
						||
| 
								 | 
							
								specialization of <tt class="literal"><span class="pre">indirect_iterator</span></tt> models the following
							 | 
						||
| 
								 | 
							
								concepts, Where <tt class="literal"><span class="pre">v</span></tt> is an object of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<ul class="simple">
							 | 
						||
| 
								 | 
							
								<li>Readable Iterator if <tt class="literal"><span class="pre">reference(*v)</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">value_type</span></tt>.</li>
							 | 
						||
| 
								 | 
							
								<li>Writable Iterator if <tt class="literal"><span class="pre">reference(*v)</span> <span class="pre">=</span> <span class="pre">t</span></tt> is a valid
							 | 
						||
| 
								 | 
							
								expression (where <tt class="literal"><span class="pre">t</span></tt> is an object of type
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_iterator::value_type</span></tt>)</li>
							 | 
						||
| 
								 | 
							
								<li>Lvalue Iterator if <tt class="literal"><span class="pre">reference</span></tt> is a reference type.</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">indirect_iterator<X,V1,C1,R1,D1></span></tt> is interoperable with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_iterator<Y,V2,C2,R2,D2></span></tt> if and only if <tt class="literal"><span class="pre">X</span></tt> is
							 | 
						||
| 
								 | 
							
								interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Before <tt class="literal"><span class="pre">indirect_iterator();</span></tt> add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								In addition to the operations required by the concepts described
							 | 
						||
| 
								 | 
							
								above, specializations of <tt class="literal"><span class="pre">indirect_iterator</span></tt> provide the
							 | 
						||
| 
								 | 
							
								following operations.</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
							 | 
						||
| 
								 | 
							
								the <tt class="literal"><span class="pre">iterator_adaptor</span></tt> subobject copy constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt> copy constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>At the end of the indirect_iterator operations add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">**m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">indirect_iterator&</span> <span class="pre">operator++();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">indirect_iterator&</span> <span class="pre">operator--();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Iterator>
							 | 
						||
| 
								 | 
							
								class reverse_iterator :
							 | 
						||
| 
								 | 
							
								  public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  friend class iterator_core_access;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Iterator>
							 | 
						||
| 
								 | 
							
								class reverse_iterator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  typedef iterator_traits<Iterator>::value_type value_type;
							 | 
						||
| 
								 | 
							
								  typedef iterator_traits<Iterator>::reference reference;
							 | 
						||
| 
								 | 
							
								  typedef iterator_traits<Iterator>::pointer pointer;
							 | 
						||
| 
								 | 
							
								  typedef iterator_traits<Iterator>::difference_type difference_type;
							 | 
						||
| 
								 | 
							
								  typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private: // as-if specification
							 | 
						||
| 
								 | 
							
								  typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void increment() { --this->base_reference(); }
							 | 
						||
| 
								 | 
							
								  void decrement() { ++this->base_reference(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void advance(typename reverse_iterator::difference_type n)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      this->base_reference() += -n;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template <class OtherIterator>
							 | 
						||
| 
								 | 
							
								  typename reverse_iterator::difference_type
							 | 
						||
| 
								 | 
							
								  distance_to(reverse_iterator<OtherIterator> const& y) const
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      return this->base_reference() - y.base();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								  Iterator const& base() const;
							 | 
						||
| 
								 | 
							
								  reference operator*() const;
							 | 
						||
| 
								 | 
							
								  reverse_iterator& operator++();
							 | 
						||
| 
								 | 
							
								  reverse_iterator& operator--();
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  Iterator m_iterator; // exposition
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>After the synopsis for <tt class="literal"><span class="pre">reverse_iterator</span></tt>, add:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If <tt class="literal"><span class="pre">Iterator</span></tt> models Random Access Traversal Iterator and Readable
							 | 
						||
| 
								 | 
							
								Lvalue Iterator, then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">random_access_iterator_tag</span></tt>. Otherwise, if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Iterator</span></tt> models Bidirectional Traversal Iterator and Readable
							 | 
						||
| 
								 | 
							
								Lvalue Iterator, then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">bidirectional_iterator_tag</span></tt>. Otherwise, <tt class="literal"><span class="pre">iterator_category</span></tt> is
							 | 
						||
| 
								 | 
							
								convertible to <tt class="literal"><span class="pre">input_iterator_tag</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><strong>reverse_iterator requirements</strong></p>
							 | 
						||
| 
								 | 
							
								<p class="last">The base <tt class="literal"><span class="pre">Iterator</span></tt> must be a model of Bidirectional Traversal
							 | 
						||
| 
								 | 
							
								Iterator. The resulting <tt class="literal"><span class="pre">reverse_iterator</span></tt> will be a model of the
							 | 
						||
| 
								 | 
							
								most refined standard traversal and access concepts that are modeled
							 | 
						||
| 
								 | 
							
								by <tt class="literal"><span class="pre">Iterator</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><strong>reverse_iterator requirements</strong></p>
							 | 
						||
| 
								 | 
							
								<p class="last"><tt class="literal"><span class="pre">Iterator</span></tt> must be a model of Bidirectional Traversal Iterator.</p>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">reverse_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>A specialization of <tt class="literal"><span class="pre">reverse_iterator</span></tt> models the same iterator
							 | 
						||
| 
								 | 
							
								traversal and iterator access concepts modeled by its <tt class="literal"><span class="pre">Iterator</span></tt>
							 | 
						||
| 
								 | 
							
								argument.  In addition, it may model old iterator concepts
							 | 
						||
| 
								 | 
							
								specified in the following table:</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="53%" />
							 | 
						||
| 
								 | 
							
								<col width="47%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>If <tt class="literal"><span class="pre">I</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								<th>then <tt class="literal"><span class="pre">reverse_iterator<I></span></tt> models</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td>Readable Lvalue Iterator,
							 | 
						||
| 
								 | 
							
								Bidirectional Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Bidirectional Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Writable Lvalue Iterator,
							 | 
						||
| 
								 | 
							
								Bidirectional Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Mutable Bidirectional Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Readable Lvalue Iterator,
							 | 
						||
| 
								 | 
							
								Random Access Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Writable Lvalue Iterator,
							 | 
						||
| 
								 | 
							
								Random Access Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Mutable Random Access Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reverse_iterator<X></span></tt> is interoperable with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">reverse_iterator<Y></span></tt> if and only if <tt class="literal"><span class="pre">X</span></tt> is interoperable with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Y</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> with a
							 | 
						||
| 
								 | 
							
								default constructed base object.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> with <tt class="literal"><span class="pre">m_iterator</span></tt> 
							 | 
						||
| 
								 | 
							
								default constructed.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> with a
							 | 
						||
| 
								 | 
							
								base object copy constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> with a
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt> constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> that is a copy of <tt class="literal"><span class="pre">r</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs instance of <tt class="literal"><span class="pre">reverse_iterator</span></tt> whose 
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">m_iterator</span></tt> subobject is constructed from <tt class="literal"><span class="pre">y.base()</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>At the end of the operations for <tt class="literal"><span class="pre">reverse_iterator</span></tt>, add:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first"><tt class="literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Iterator tmp = m_iterator;
							 | 
						||
| 
								 | 
							
								return *--tmp;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reverse_iterator&</span> <span class="pre">operator++();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reverse_iterator&</span> <span class="pre">operator--();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_iterator</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class transform_iterator
							 | 
						||
| 
								 | 
							
								  : public iterator_adaptor</* see discussion */>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  friend class iterator_core_access;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class transform_iterator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  typedef /* see below */ value_type;
							 | 
						||
| 
								 | 
							
								  typedef /* see below */ reference;
							 | 
						||
| 
								 | 
							
								  typedef /* see below */ pointer;
							 | 
						||
| 
								 | 
							
								  typedef iterator_traits<Iterator>::difference_type difference_type;
							 | 
						||
| 
								 | 
							
								  typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>After <tt class="literal"><span class="pre">UnaryFunction</span> <span class="pre">functor()</span> <span class="pre">const;</span></tt> add:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Iterator const& base() const;
							 | 
						||
| 
								 | 
							
								reference operator*() const;
							 | 
						||
| 
								 | 
							
								transform_iterator& operator++();
							 | 
						||
| 
								 | 
							
								transform_iterator& operator--();
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  typename transform_iterator::value_type dereference() const;
							 | 
						||
| 
								 | 
							
								  UnaryFunction m_f;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  Iterator m_iterator; // exposition only
							 | 
						||
| 
								 | 
							
								  UnaryFunction m_f;   // exposition only
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>After the synopsis, add:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and if <tt class="literal"><span class="pre">Iterator</span></tt>
							 | 
						||
| 
								 | 
							
								models Random Access Traversal Iterator, then <tt class="literal"><span class="pre">iterator_category</span></tt> is
							 | 
						||
| 
								 | 
							
								convertible to <tt class="literal"><span class="pre">random_access_iterator_tag</span></tt>. Otherwise, if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Iterator</span></tt> models Bidirectional Traversal Iterator, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">bidirectional_iterator_tag</span></tt>.  Otherwise <tt class="literal"><span class="pre">iterator_category</span></tt> is
							 | 
						||
| 
								 | 
							
								convertible to <tt class="literal"><span class="pre">forward_iterator_tag</span></tt>. If <tt class="literal"><span class="pre">Iterator</span></tt> does not
							 | 
						||
| 
								 | 
							
								model Readable Lvalue Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is
							 | 
						||
| 
								 | 
							
								convertible to <tt class="literal"><span class="pre">input_iterator_tag</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>In the requirements section, change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first">The type <tt class="literal"><span class="pre">Iterator</span></tt> must at least model Readable Iterator.  The
							 | 
						||
| 
								 | 
							
								resulting <tt class="literal"><span class="pre">transform_iterator</span></tt> models the most refined of the
							 | 
						||
| 
								 | 
							
								following that is also modeled by <tt class="literal"><span class="pre">Iterator</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<ul class="simple">
							 | 
						||
| 
								 | 
							
								<li>Writable Lvalue Iterator if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>
							 | 
						||
| 
								 | 
							
								is a non-const reference.</li>
							 | 
						||
| 
								 | 
							
								<li>Readable Lvalue Iterator if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>
							 | 
						||
| 
								 | 
							
								is a const reference.</li>
							 | 
						||
| 
								 | 
							
								<li>Readable Iterator otherwise.</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">transform_iterator</span></tt> models the most refined standard traversal
							 | 
						||
| 
								 | 
							
								concept that is modeled by <tt class="literal"><span class="pre">Iterator</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">The <tt class="literal"><span class="pre">reference</span></tt> type of <tt class="literal"><span class="pre">transform_iterator</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>.
							 | 
						||
| 
								 | 
							
								The <tt class="literal"><span class="pre">value_type</span></tt> is <tt class="literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The argument <tt class="literal"><span class="pre">Iterator</span></tt> shall model Readable Iterator.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>After the requirements section, add:</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">transform_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The resulting <tt class="literal"><span class="pre">transform_iterator</span></tt> models the most refined of the
							 | 
						||
| 
								 | 
							
								following options that is also modeled by <tt class="literal"><span class="pre">Iterator</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<ul class="simple">
							 | 
						||
| 
								 | 
							
								<li>Writable Lvalue Iterator if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">transform_iterator::reference</span></tt> is a non-const
							 | 
						||
| 
								 | 
							
								reference.</li>
							 | 
						||
| 
								 | 
							
								<li>Readable Lvalue Iterator if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">transform_iterator::reference</span></tt> is a const reference.</li>
							 | 
						||
| 
								 | 
							
								<li>Readable Iterator otherwise.</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">transform_iterator</span></tt> models the most refined standard traversal
							 | 
						||
| 
								 | 
							
								concept that is modeled by the <tt class="literal"><span class="pre">Iterator</span></tt> argument.</p>
							 | 
						||
| 
								 | 
							
								<p>If <tt class="literal"><span class="pre">transform_iterator</span></tt> is a model of Readable Lvalue Iterator then
							 | 
						||
| 
								 | 
							
								it models the following original iterator concepts depending on what
							 | 
						||
| 
								 | 
							
								the <tt class="literal"><span class="pre">Iterator</span></tt> argument models.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="50%" />
							 | 
						||
| 
								 | 
							
								<col width="50%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								<th>then <tt class="literal"><span class="pre">transform_iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Input Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Forward Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Forward Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Bidirectional Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Bidirectional Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Random Access Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>If <tt class="literal"><span class="pre">transform_iterator</span></tt> models Writable Lvalue Iterator then it is a
							 | 
						||
| 
								 | 
							
								mutable iterator (as defined in the old iterator requirements).</p>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">transform_iterator<F1,</span> <span class="pre">X,</span> <span class="pre">R1,</span> <span class="pre">V1></span></tt> is interoperable with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">transform_iterator<F2,</span> <span class="pre">Y,</span> <span class="pre">R2,</span> <span class="pre">V2></span></tt> if and only if <tt class="literal"><span class="pre">X</span></tt> is
							 | 
						||
| 
								 | 
							
								interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Remove the private operations section heading and remove:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								``typename transform_iterator::value_type dereference() const;``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:Returns: ``m_f(transform_iterator::dereference());``
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>After the entry for <tt class="literal"><span class="pre">functor()</span></tt>, add:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								``Iterator const& base() const;``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:Returns: ``m_iterator``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``reference operator*() const;``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:Returns: ``m_f(*m_iterator)``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``transform_iterator& operator++();``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:Effects: ``++m_iterator``
							 | 
						||
| 
								 | 
							
								:Returns: ``*this``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``transform_iterator& operator--();``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:Effects: ``--m_iterator``
							 | 
						||
| 
								 | 
							
								:Returns: ``*this``
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Predicate, class Iterator>
							 | 
						||
| 
								 | 
							
								class filter_iterator
							 | 
						||
| 
								 | 
							
								   : public iterator_adaptor<
							 | 
						||
| 
								 | 
							
								         filter_iterator<Predicate, Iterator>, Iterator
							 | 
						||
| 
								 | 
							
								       , use_default
							 | 
						||
| 
								 | 
							
								       , /* see details */
							 | 
						||
| 
								 | 
							
								     >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Predicate, class Iterator>
							 | 
						||
| 
								 | 
							
								class filter_iterator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								   typedef iterator_traits<Iterator>::value_type value_type;
							 | 
						||
| 
								 | 
							
								   typedef iterator_traits<Iterator>::reference reference;
							 | 
						||
| 
								 | 
							
								   typedef iterator_traits<Iterator>::pointer pointer;
							 | 
						||
| 
								 | 
							
								   typedef iterator_traits<Iterator>::difference_type difference_type;
							 | 
						||
| 
								 | 
							
								   typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private: // as-if specification
							 | 
						||
| 
								 | 
							
								   void increment()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								       ++(this->base_reference());
							 | 
						||
| 
								 | 
							
								       satisfy_predicate();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void satisfy_predicate()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								       while (this->base() != this->m_end && !this->m_predicate(*this->base()))
							 | 
						||
| 
								 | 
							
								           ++(this->base_reference());
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   Predicate m_predicate;
							 | 
						||
| 
								 | 
							
								   Iterator m_end;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								    Iterator const& base() const;
							 | 
						||
| 
								 | 
							
								    reference operator*() const;
							 | 
						||
| 
								 | 
							
								    filter_iterator& operator++();
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    Predicate m_pred; // exposition only
							 | 
						||
| 
								 | 
							
								    Iterator m_iter;  // exposition only
							 | 
						||
| 
								 | 
							
								    Iterator m_end;   // exposition only
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The base <tt class="literal"><span class="pre">Iterator</span></tt> parameter must be a model of Readable
							 | 
						||
| 
								 | 
							
								Iterator and Single Pass Iterator. The resulting
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">filter_iterator</span></tt> will be a model of Forward Traversal Iterator
							 | 
						||
| 
								 | 
							
								if <tt class="literal"><span class="pre">Iterator</span></tt> is, otherwise the <tt class="literal"><span class="pre">filter_iterator</span></tt> will be a
							 | 
						||
| 
								 | 
							
								model of Single Pass Iterator. The access category of the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">filter_iterator</span></tt> will be the same as the access category of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Iterator</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">Iterator</span></tt> argument shall meet the requirements of Readable
							 | 
						||
| 
								 | 
							
								Iterator and Single Pass Iterator or it shall meet the requirements of
							 | 
						||
| 
								 | 
							
								Input Iterator.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>After the requirements section, add:</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">filter_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The concepts that <tt class="literal"><span class="pre">filter_iterator</span></tt> models are dependent on which
							 | 
						||
| 
								 | 
							
								concepts the <tt class="literal"><span class="pre">Iterator</span></tt> argument models, as specified in the
							 | 
						||
| 
								 | 
							
								following tables.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="33%" />
							 | 
						||
| 
								 | 
							
								<col width="67%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Forward Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Forward Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="41%" />
							 | 
						||
| 
								 | 
							
								<col width="59%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td>Readable Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Readable Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Writable Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Writable Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Lvalue Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Lvalue Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="63%" />
							 | 
						||
| 
								 | 
							
								<col width="38%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td>Readable Iterator, Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Input Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Readable Lvalue Iterator, Forward Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Forward Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td>Writable Lvalue Iterator, Forward Traversal Iterator</td>
							 | 
						||
| 
								 | 
							
								<td>Mutable Forward Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">filter_iterator<P1,</span> <span class="pre">X></span></tt> is interoperable with <tt class="literal"><span class="pre">filter_iterator<P2,</span> <span class="pre">Y></span></tt> 
							 | 
						||
| 
								 | 
							
								if and only if <tt class="literal"><span class="pre">X</span></tt> is interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">a <tt class="literal"><span class="pre">filter_iterator</span></tt> whose
							 | 
						||
| 
								 | 
							
								predicate is a default constructed <tt class="literal"><span class="pre">Predicate</span></tt> and
							 | 
						||
| 
								 | 
							
								whose <tt class="literal"><span class="pre">end</span></tt> is a default constructed <tt class="literal"><span class="pre">Iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> whose``m_pred``,  <tt class="literal"><span class="pre">m_iter</span></tt>, and <tt class="literal"><span class="pre">m_end</span></tt> 
							 | 
						||
| 
								 | 
							
								members are a default constructed.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A <tt class="literal"><span class="pre">filter_iterator</span></tt> at position <tt class="literal"><span class="pre">x</span></tt> that filters according
							 | 
						||
| 
								 | 
							
								to predicate <tt class="literal"><span class="pre">f</span></tt> and that will not increment past <tt class="literal"><span class="pre">end</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
							 | 
						||
| 
								 | 
							
								the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">f(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt> 
							 | 
						||
| 
								 | 
							
								or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is constructed from
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">f</span></tt> and <tt class="literal"><span class="pre">m_end</span></tt> from <tt class="literal"><span class="pre">end</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A <tt class="literal"><span class="pre">filter_iterator</span></tt> at position <tt class="literal"><span class="pre">x</span></tt> that filters 
							 | 
						||
| 
								 | 
							
								according to a default constructed <tt class="literal"><span class="pre">Predicate</span></tt>
							 | 
						||
| 
								 | 
							
								and that will not increment past <tt class="literal"><span class="pre">end</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
							 | 
						||
| 
								 | 
							
								the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt> 
							 | 
						||
| 
								 | 
							
								or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is default constructed.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A copy of iterator <tt class="literal"><span class="pre">t</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a filter iterator whose members are copied from <tt class="literal"><span class="pre">t</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A copy of the predicate object used to construct <tt class="literal"><span class="pre">*this</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_pred</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">The object <tt class="literal"><span class="pre">end</span></tt> used to construct <tt class="literal"><span class="pre">*this</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_end</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>At the end of the operations section, add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*m_iter</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">filter_iterator&</span> <span class="pre">operator++();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Increments <tt class="literal"><span class="pre">m_iter</span></tt> and then continues to
							 | 
						||
| 
								 | 
							
								increment <tt class="literal"><span class="pre">m_iter</span></tt> until either <tt class="literal"><span class="pre">m_iter</span> <span class="pre">==</span> <span class="pre">m_end</span></tt>
							 | 
						||
| 
								 | 
							
								or <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class counting_iterator
							 | 
						||
| 
								 | 
							
								  : public iterator_adaptor<
							 | 
						||
| 
								 | 
							
								        counting_iterator<Incrementable, Access, Traversal, Difference>
							 | 
						||
| 
								 | 
							
								      , Incrementable
							 | 
						||
| 
								 | 
							
								      , Incrementable
							 | 
						||
| 
								 | 
							
								      , Access
							 | 
						||
| 
								 | 
							
								      , /* see details for traversal category */
							 | 
						||
| 
								 | 
							
								      , Incrementable const&
							 | 
						||
| 
								 | 
							
								      , Incrementable const*
							 | 
						||
| 
								 | 
							
								      , /* distance = Difference or a signed integral type */>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    friend class iterator_core_access;
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								class counting_iterator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								    typedef Incrementable value_type;
							 | 
						||
| 
								 | 
							
								    typedef const Incrementable& reference;
							 | 
						||
| 
								 | 
							
								    typedef const Incrementable* pointer;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ difference_type;
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    typename counting_iterator::reference dereference() const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return this->base_reference();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								    Incrementable const& base() const;
							 | 
						||
| 
								 | 
							
								    reference operator*() const;
							 | 
						||
| 
								 | 
							
								    counting_iterator& operator++();
							 | 
						||
| 
								 | 
							
								    counting_iterator& operator--();
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    Incrementable m_inc; // exposition
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>After the synopsis, add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>If the <tt class="literal"><span class="pre">Difference</span></tt> argument is <tt class="literal"><span class="pre">use_default</span></tt> then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">difference_type</span></tt> is an unspecified signed integral
							 | 
						||
| 
								 | 
							
								type. Otherwise <tt class="literal"><span class="pre">difference_type</span></tt> is <tt class="literal"><span class="pre">Difference</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">iterator_category</span></tt> is determined according to the following
							 | 
						||
| 
								 | 
							
								algorithm:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if (CategoryOrTraversal is not use_default)
							 | 
						||
| 
								 | 
							
								    return CategoryOrTraversal
							 | 
						||
| 
								 | 
							
								else if (numeric_limits<Incrementable>::is_specialized)
							 | 
						||
| 
								 | 
							
								    return <em>iterator-category</em>(
							 | 
						||
| 
								 | 
							
								        random_access_traversal_tag, Incrementable, const Incrementable&)
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    return <em>iterator-category</em>(
							 | 
						||
| 
								 | 
							
								         iterator_traversal<Incrementable>::type, 
							 | 
						||
| 
								 | 
							
								         Incrementable, const Incrementable&)
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><dl class="first last">
							 | 
						||
| 
								 | 
							
								<dt>[<em>Note:</em> implementers are encouraged to provide an implementation of</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">distance_to</span></tt> and a <tt class="literal"><span class="pre">difference_type</span></tt> that avoids overflows in
							 | 
						||
| 
								 | 
							
								the cases when the <tt class="literal"><span class="pre">Incrementable</span></tt> type is a numeric type.]</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><dl class="first last">
							 | 
						||
| 
								 | 
							
								<dt>[<em>Note:</em> implementers are encouraged to provide an implementation of</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">operator-</span></tt> and a <tt class="literal"><span class="pre">difference_type</span></tt> that avoid overflows in
							 | 
						||
| 
								 | 
							
								the cases where <tt class="literal"><span class="pre">std::numeric_limits<Incrementable>::is_specialized</span></tt>
							 | 
						||
| 
								 | 
							
								is true.]</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first">The <tt class="literal"><span class="pre">Incrementable</span></tt> type must be Default Constructible, Copy
							 | 
						||
| 
								 | 
							
								Constructible, and Assignable.  The default distance is
							 | 
						||
| 
								 | 
							
								an implementation defined signed integegral type.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">The resulting <tt class="literal"><span class="pre">counting_iterator</span></tt> models Readable Lvalue Iterator.</p>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">Incrementable</span></tt> argument shall be Copy Constructible and Assignable.</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>Furthermore, if you wish to create a counting iterator that is a Forward
							 | 
						||
| 
								 | 
							
								Traversal Iterator, then the following expressions must be valid:</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to <tt class="literal"><span class="pre">forward_iterator_tag</span></tt>
							 | 
						||
| 
								 | 
							
								or <tt class="literal"><span class="pre">forward_traversal_tag</span></tt>, the following must be well-formed:</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If you wish to create a counting iterator that is a 
							 | 
						||
| 
								 | 
							
								Bidirectional Traversal Iterator, then pre-decrement is also required:</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">bidirectional_iterator_tag</span></tt> or <tt class="literal"><span class="pre">bidirectional_traversal_tag</span></tt>,
							 | 
						||
| 
								 | 
							
								the following expression must also be well-formed:</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If you wish to create a counting iterator that is a Random Access
							 | 
						||
| 
								 | 
							
								Traversal Iterator, then these additional expressions are also
							 | 
						||
| 
								 | 
							
								required:</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>If <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">random_access_iterator_tag</span></tt> or <tt class="literal"><span class="pre">random_access_traversal_tag</span></tt>,
							 | 
						||
| 
								 | 
							
								the following must must also be valid:</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>After the requirements section, add:</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title"><tt class="literal"><span class="pre">counting_iterator</span></tt> models</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>Specializations of <tt class="literal"><span class="pre">counting_iterator</span></tt> model Readable Lvalue
							 | 
						||
| 
								 | 
							
								Iterator. In addition, they model the concepts corresponding to the
							 | 
						||
| 
								 | 
							
								iterator tags to which their <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible.
							 | 
						||
| 
								 | 
							
								Also, if <tt class="literal"><span class="pre">CategoryOrTraversal</span></tt> is not <tt class="literal"><span class="pre">use_default</span></tt> then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">counting_iterator</span></tt> models the concept corresponding to the iterator
							 | 
						||
| 
								 | 
							
								tag <tt class="literal"><span class="pre">CategoryOrTraversal</span></tt>.  Otherwise, if
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">numeric_limits<Incrementable>::is_specialized</span></tt>, then
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">counting_iterator</span></tt> models Random Access Traversal Iterator.
							 | 
						||
| 
								 | 
							
								Otherwise, <tt class="literal"><span class="pre">counting_iterator</span></tt> models the same iterator traversal
							 | 
						||
| 
								 | 
							
								concepts modeled by <tt class="literal"><span class="pre">Incrementable</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">counting_iterator<X,C1,D1></span></tt> is interoperable with
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">counting_iterator<Y,C2,D2></span></tt> if and only if <tt class="literal"><span class="pre">X</span></tt> is
							 | 
						||
| 
								 | 
							
								interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>At the begining of the operations section, add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								In addition to the operations required by the concepts modeled by
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">counting_iterator</span></tt>, <tt class="literal"><span class="pre">counting_iterator</span></tt> provides the following
							 | 
						||
| 
								 | 
							
								operations.</blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A default constructed instance of <tt class="literal"><span class="pre">counting_iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Incrementable</span></tt> is Default Constructible.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Default construct the member <tt class="literal"><span class="pre">m_inc</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">counting_iterator</span></tt> that is a copy of <tt class="literal"><span class="pre">rhs</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Construct member <tt class="literal"><span class="pre">m_inc</span></tt> from <tt class="literal"><span class="pre">rhs.m_inc</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">counting_iterator</span></tt> with its base
							 | 
						||
| 
								 | 
							
								object copy constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><table class="first last field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Construct member <tt class="literal"><span class="pre">m_inc</span></tt> from <tt class="literal"><span class="pre">x</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>At the end of the operations section, add:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_inc</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">counting_iterator&</span> <span class="pre">operator++();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_inc</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">counting_iterator&</span> <span class="pre">operator--();</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_inc</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">Incrementable</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_inc</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-problem-with-specification-of-a-m-in-readable-iterator">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id40" name="x-problem-with-specification-of-a-m-in-readable-iterator">9.38x Problem with specification of a->m in Readable Iterator</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Howard Hinnant</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Status:</th><td class="field-body">New</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12585:</p>
							 | 
						||
| 
								 | 
							
								<p>Readable Iterator Requirements says:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="13%" />
							 | 
						||
| 
								 | 
							
								<col width="10%" />
							 | 
						||
| 
								 | 
							
								<col width="77%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a->m</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">U&</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>pre: <tt class="literal"><span class="pre">(*a).m</span></tt> is well-defined. Equivalent to <tt class="literal"><span class="pre">(*a).m</span></tt></td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Do we mean to outlaw iterators with proxy references from meeting
							 | 
						||
| 
								 | 
							
								the readable requirements?</p>
							 | 
						||
| 
								 | 
							
								<p>Would it be better for the requirements to read <tt class="literal"><span class="pre">static_cast<T>(*a).m</span></tt>
							 | 
						||
| 
								 | 
							
								instead of <tt class="literal"><span class="pre">(*a).m</span></tt> ?</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">NAD.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body"><p class="first">We think you're misreading "pre:".
							 | 
						||
| 
								 | 
							
								If <tt class="literal"><span class="pre">(*a).m</span></tt> is not well defined, then the iterator is not
							 | 
						||
| 
								 | 
							
								required to provide <tt class="literal"><span class="pre">a->m</span></tt>. So a proxy iterator is not
							 | 
						||
| 
								 | 
							
								required to provide <tt class="literal"><span class="pre">a->m</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">As an aside, it is possible for proxy iterators to
							 | 
						||
| 
								 | 
							
								support <tt class="literal"><span class="pre">-></span></tt>, so changing the requirements to
							 | 
						||
| 
								 | 
							
								read <tt class="literal"><span class="pre">static_cast<T>(*a).m</span></tt> is interesting.
							 | 
						||
| 
								 | 
							
								However, such a change to Readable Iterator would
							 | 
						||
| 
								 | 
							
								mean that it no longer corresponds to the
							 | 
						||
| 
								 | 
							
								input iterator requirements. So old iterators would not
							 | 
						||
| 
								 | 
							
								necessarily conform to new iterator requirements.</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-counting-iterator-traversal-argument-unspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id41" name="x-counting-iterator-traversal-argument-unspecified">9.39x counting_iterator Traversal argument unspecified</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12635:</p>
							 | 
						||
| 
								 | 
							
								<p>counting_iterator takes an argument for its Traversal type, with a
							 | 
						||
| 
								 | 
							
								default value of use_default. It is derived from an instance of
							 | 
						||
| 
								 | 
							
								iterator_adaptor, where the argument passed for the Traversal type
							 | 
						||
| 
								 | 
							
								is described as "<tt class="literal"><span class="pre">/*</span> <span class="pre">see</span> <span class="pre">details</span> <span class="pre">for</span> <span class="pre">traversal</span> <span class="pre">category</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">*/</span></tt>". The details for counting_iterator describe constraints on
							 | 
						||
| 
								 | 
							
								the Incrementable type imposed by various traversal
							 | 
						||
| 
								 | 
							
								categories. There is no description of what the argument to
							 | 
						||
| 
								 | 
							
								iterator_adaptor should be.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body">We no longer inherit from iterator_adaptor. So instead,
							 | 
						||
| 
								 | 
							
								we specify the iterator_category in terms of the Traversal type
							 | 
						||
| 
								 | 
							
								(which is now called CategoryOrTraversal). Also the
							 | 
						||
| 
								 | 
							
								requirements and models section was reorganized to
							 | 
						||
| 
								 | 
							
								match these changes and to make more sense.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-indirect-iterator-requirements-muddled">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id42" name="x-indirect-iterator-requirements-muddled">9.40x indirect_iterator requirements muddled</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12640:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The value_type of the Iterator template parameter should itself
							 | 
						||
| 
								 | 
							
								be dereferenceable. The return type of the <tt class="literal"><span class="pre">operator*</span></tt> for
							 | 
						||
| 
								 | 
							
								the value_type must be the same type as the Reference template
							 | 
						||
| 
								 | 
							
								parameter.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>I'd say this a bit differently, to emphasize what's required:
							 | 
						||
| 
								 | 
							
								iterator_traits<Iterator>::value_type must be dereferenceable.
							 | 
						||
| 
								 | 
							
								The Reference template parameter must be the same type as 
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">*iterator_traits<Iterator>::value_type()</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The Value template parameter will be the value_type for the 
							 | 
						||
| 
								 | 
							
								indirect_iterator, unless Value is const. If Value is const X, then 
							 | 
						||
| 
								 | 
							
								value_type will be non- const X.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Also non-volatile, right? In other words, if Value isn't use_default, it 
							 | 
						||
| 
								 | 
							
								just gets passed as the Value argument for iterator_adaptor.</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The default for Value is:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								iterator_traits< iterator_traits<Iterator>::value_type >::value_type
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>If the default is used for Value, then there must be a valid
							 | 
						||
| 
								 | 
							
								specialization of iterator_traits for the value type of the
							 | 
						||
| 
								 | 
							
								base iterator.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>The earlier requirement is that
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt> must be
							 | 
						||
| 
								 | 
							
								dereferenceable. Now it's being treated as an iterator. Is this
							 | 
						||
| 
								 | 
							
								just a pun, or is <tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>
							 | 
						||
| 
								 | 
							
								required to be some form of iterator? If it's the former we need
							 | 
						||
| 
								 | 
							
								to find a different way to say it.  If it's the latter we need to
							 | 
						||
| 
								 | 
							
								say so.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">value_type</span></tt> of the <tt class="literal"><span class="pre">Iterator</span></tt> template parameter
							 | 
						||
| 
								 | 
							
								should itself be dereferenceable. The return type of the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator*</span></tt> for the <tt class="literal"><span class="pre">value_type</span></tt> must be the same type as
							 | 
						||
| 
								 | 
							
								the <tt class="literal"><span class="pre">Reference</span></tt> template parameter. The <tt class="literal"><span class="pre">Value</span></tt> template
							 | 
						||
| 
								 | 
							
								parameter will be the <tt class="literal"><span class="pre">value_type</span></tt> for the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_iterator</span></tt>, unless <tt class="literal"><span class="pre">Value</span></tt> is const. If <tt class="literal"><span class="pre">Value</span></tt>
							 | 
						||
| 
								 | 
							
								is <tt class="literal"><span class="pre">const</span> <span class="pre">X</span></tt>, then <tt class="literal"><span class="pre">value_type</span></tt> will be <em>non-</em> <tt class="literal"><span class="pre">const</span> <span class="pre">X</span></tt>.
							 | 
						||
| 
								 | 
							
								The default for <tt class="literal"><span class="pre">Value</span></tt> is:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								iterator_traits< iterator_traits<Iterator>::value_type >::value_type
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>If the default is used for <tt class="literal"><span class="pre">Value</span></tt>, then there must be a
							 | 
						||
| 
								 | 
							
								valid specialization of <tt class="literal"><span class="pre">iterator_traits</span></tt> for the value type
							 | 
						||
| 
								 | 
							
								of the base iterator.</p>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">Reference</span></tt> parameter will be the <tt class="literal"><span class="pre">reference</span></tt> type of the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_iterator</span></tt>. The default is <tt class="literal"><span class="pre">Value&</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p>The <tt class="literal"><span class="pre">Access</span></tt> and <tt class="literal"><span class="pre">Traversal</span></tt> parameters are passed
							 | 
						||
| 
								 | 
							
								unchanged to the corresponding parameters of the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_adaptor</span></tt> base class, and the <tt class="literal"><span class="pre">Iterator</span></tt> parameter
							 | 
						||
| 
								 | 
							
								is passed unchanged as the <tt class="literal"><span class="pre">Base</span></tt> parameter to the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_adaptor</span></tt> base class.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The expression <tt class="literal"><span class="pre">*v</span></tt>, where <tt class="literal"><span class="pre">v</span></tt> is an object of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, shall be valid
							 | 
						||
| 
								 | 
							
								expression and convertible to <tt class="literal"><span class="pre">reference</span></tt>.  <tt class="literal"><span class="pre">Iterator</span></tt>
							 | 
						||
| 
								 | 
							
								shall model the traversal concept indicated by
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt>.  <tt class="literal"><span class="pre">Value</span></tt>, <tt class="literal"><span class="pre">Reference</span></tt>, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Difference</span></tt> shall be chosen so that <tt class="literal"><span class="pre">value_type</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">reference</span></tt>, and <tt class="literal"><span class="pre">difference_type</span></tt> meet the requirements
							 | 
						||
| 
								 | 
							
								indicated by <tt class="literal"><span class="pre">iterator_category</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>[Note: there are further requirements on the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt> if the <tt class="literal"><span class="pre">Value</span></tt>
							 | 
						||
| 
								 | 
							
								parameter is not <tt class="literal"><span class="pre">use_default</span></tt>, as implied by the algorithm
							 | 
						||
| 
								 | 
							
								for deducing the default for the <tt class="literal"><span class="pre">value_type</span></tt> member.]</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">Not included above is the specification of the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">value_type</span></tt>, <tt class="literal"><span class="pre">reference</span></tt>, etc., members, which is handled by
							 | 
						||
| 
								 | 
							
								the changes in 9.37x.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-problem-with-transform-iterator-requirements">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id43" name="x-problem-with-transform-iterator-requirements">9.41x Problem with transform_iterator requirements</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12641:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The reference type of transform_iterator is <tt class="literal"><span class="pre">result_of<</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">UnaryFunction(iterator_traits<Iterator>::reference)</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">>::type</span></tt>. The <tt class="literal"><span class="pre">value_type</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>These are the defaults, right? If the user supplies their own types
							 | 
						||
| 
								 | 
							
								that's what gets passed to iterator_adaptor. And again, the
							 | 
						||
| 
								 | 
							
								specification should be in terms of the specialization of
							 | 
						||
| 
								 | 
							
								iterator_adaptor, and not in terms of the result:</p>
							 | 
						||
| 
								 | 
							
								<p>Reference argument to iterator_adaptor:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if (Reference != use_default)
							 | 
						||
| 
								 | 
							
								    Reference
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    result_of<
							 | 
						||
| 
								 | 
							
								        UnaryFunction(iterator_traits<Iterator>::reference)
							 | 
						||
| 
								 | 
							
								    >::type
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>Value argument to iterator_adaptor:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if (Value != use_default)
							 | 
						||
| 
								 | 
							
								    Value
							 | 
						||
| 
								 | 
							
								else if (Reference != use_default)
							 | 
						||
| 
								 | 
							
								    remove_reference<reference>::type
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    remove_reference<
							 | 
						||
| 
								 | 
							
								        result_of<
							 | 
						||
| 
								 | 
							
								            UnaryFunction(iterator_traits<Iterator>::reference)
							 | 
						||
| 
								 | 
							
								        >::type
							 | 
						||
| 
								 | 
							
								    >::type
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>There's probably a better way to specify that last alternative, but
							 | 
						||
| 
								 | 
							
								I've been at this too long, and it's all turning into a maze of
							 | 
						||
| 
								 | 
							
								twisty passages, all alike.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Replace:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The reference type of transform_iterator is <tt class="literal"><span class="pre">result_of<</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">UnaryFunction(iterator_traits<Iterator>::reference)</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">>::type</span></tt>. The <tt class="literal"><span class="pre">value_type</span></tt> is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>with:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>If <tt class="literal"><span class="pre">Reference</span></tt> is <tt class="literal"><span class="pre">use_default</span></tt> then the <tt class="literal"><span class="pre">reference</span></tt>
							 | 
						||
| 
								 | 
							
								member of <tt class="literal"><span class="pre">transform_iterator</span></tt> is <tt class="literal"><span class="pre">result_of<</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">UnaryFunction(iterator_traits<Iterator>::reference)</span>
							 | 
						||
| 
								 | 
							
								<span class="pre">>::type</span></tt>.  Otherwise, <tt class="literal"><span class="pre">reference</span></tt> is <tt class="literal"><span class="pre">Reference</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p>If <tt class="literal"><span class="pre">Value</span></tt> is <tt class="literal"><span class="pre">use_default</span></tt> then the <tt class="literal"><span class="pre">value_type</span></tt>
							 | 
						||
| 
								 | 
							
								member is <tt class="literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>.
							 | 
						||
| 
								 | 
							
								Otherwise, <tt class="literal"><span class="pre">value_type</span></tt> is <tt class="literal"><span class="pre">Value</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-filter-iterator-details-unspecified">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id44" name="x-filter-iterator-details-unspecified">9.42x filter_iterator details unspecified</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Pete Becker</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>c++std-lib-12642:</p>
							 | 
						||
| 
								 | 
							
								<p>The paper says:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template<class Predicate, class Iterator>
							 | 
						||
| 
								 | 
							
								class filter_iterator
							 | 
						||
| 
								 | 
							
								     : public iterator_adaptor<
							 | 
						||
| 
								 | 
							
								         filter_iterator<Predicate, Iterator>,
							 | 
						||
| 
								 | 
							
								         Iterator,
							 | 
						||
| 
								 | 
							
								         use_default,
							 | 
						||
| 
								 | 
							
								         /* see details */ >
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>That comment covers the Access, Traversal, Reference, and Difference
							 | 
						||
| 
								 | 
							
								arguments. The only specification for any of these in the details is:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								The access category of the filter_iterator will be the same as
							 | 
						||
| 
								 | 
							
								the access category of Iterator.</blockquote>
							 | 
						||
| 
								 | 
							
								<p>Needs more.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Add to the synopsis:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								typedef iterator_traits<Iterator>::value_type value_type;
							 | 
						||
| 
								 | 
							
								typedef iterator_traits<Iterator>::reference reference;
							 | 
						||
| 
								 | 
							
								typedef iterator_traits<Iterator>::pointer pointer;
							 | 
						||
| 
								 | 
							
								typedef iterator_traits<Iterator>::difference_type difference_type;
							 | 
						||
| 
								 | 
							
								typedef /* see below */ iterator_category;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>and add just after the synopsis:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								If <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Forward
							 | 
						||
| 
								 | 
							
								Traversal Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible
							 | 
						||
| 
								 | 
							
								to <tt class="literal"><span class="pre">std::forward_iterator_tag</span></tt>. Otherwise
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">std::input_iterator_tag</span></tt>.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-transform-iterator-interoperability-too-restrictive">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id45" name="x-transform-iterator-interoperability-too-restrictive">9.43x transform_iterator interoperability too restrictive</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Jeremy Siek</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>We do not need to require that the function objects have the same
							 | 
						||
| 
								 | 
							
								type, just that they be convertible.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template<class OtherIterator, class R2, class V2>
							 | 
						||
| 
								 | 
							
								transform_iterator(
							 | 
						||
| 
								 | 
							
								      transform_iterator<UnaryFunction, OtherIterator, R2, V2> const& t
							 | 
						||
| 
								 | 
							
								    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="last literal-block">
							 | 
						||
| 
								 | 
							
								template<class F2, class I2, class R2, class V2>
							 | 
						||
| 
								 | 
							
								transform_iterator(
							 | 
						||
| 
								 | 
							
								      transform_iterator<F2, I2, R2, V2> const& t
							 | 
						||
| 
								 | 
							
								    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
							 | 
						||
| 
								 | 
							
								    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="y-indirect-iterator-and-smart-pointers">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id46" name="y-indirect-iterator-and-smart-pointers">9.44y <tt class="literal"><span class="pre">indirect_iterator</span></tt> and smart pointers</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">indirect_iterator</span></tt> should be able to iterate over containers of
							 | 
						||
| 
								 | 
							
								smart pointers, but the mechanism that allows it was left out of
							 | 
						||
| 
								 | 
							
								the specification, even though it's present in the Boost
							 | 
						||
| 
								 | 
							
								specification</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Add <tt class="literal"><span class="pre">pointee</span></tt> and <tt class="literal"><span class="pre">indirect_reference</span></tt>
							 | 
						||
| 
								 | 
							
								to deal with this capability.</p>
							 | 
						||
| 
								 | 
							
								<p>In [lib.iterator.helper.synopsis], add:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dereferenceable>
							 | 
						||
| 
								 | 
							
								struct pointee;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Dereferenceable>
							 | 
						||
| 
								 | 
							
								struct indirect_reference;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p class="last">After <tt class="literal"><span class="pre">indirect_iterator</span></tt>'s abstract, add:</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title">Class template <tt class="literal"><span class="pre">pointee</span></tt></p>
							 | 
						||
| 
								 | 
							
								<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
							 | 
						||
| 
								 | 
							
								<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
							 | 
						||
| 
								 | 
							
								<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dereferenceable>
							 | 
						||
| 
								 | 
							
								struct pointee
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Requires:</th><td class="field-body">For an object <tt class="literal"><span class="pre">x</span></tt> of type <tt class="literal"><span class="pre">Dereferenceable</span></tt>, <tt class="literal"><span class="pre">*x</span></tt>
							 | 
						||
| 
								 | 
							
								is well-formed.  If <tt class="literal"><span class="pre">++x</span></tt> is ill-formed it shall neither be
							 | 
						||
| 
								 | 
							
								ambiguous nor shall it violate access control, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Dereferenceable::element_type</span></tt> shall be an accessible type.
							 | 
						||
| 
								 | 
							
								Otherwise <tt class="literal"><span class="pre">iterator_traits<Dereferenceable>::value_type</span></tt> shall
							 | 
						||
| 
								 | 
							
								be well formed.  [Note: These requirements need not apply to
							 | 
						||
| 
								 | 
							
								explicit or partial specializations of <tt class="literal"><span class="pre">pointee</span></tt>]</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">type</span></tt> is determined according to the following algorithm, where
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">x</span></tt> is an object of type <tt class="literal"><span class="pre">Dereferenceable</span></tt>:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if ( ++x is ill-formed )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return ``Dereferenceable::element_type``
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (``*x`` is a mutable reference to
							 | 
						||
| 
								 | 
							
								         std::iterator_traits<Dereferenceable>::value_type)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return iterator_traits<Dereferenceable>::value_type
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return iterator_traits<Dereferenceable>::value_type const
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="topic">
							 | 
						||
| 
								 | 
							
								<p class="topic-title">Class template <tt class="literal"><span class="pre">indirect_reference</span></tt></p>
							 | 
						||
| 
								 | 
							
								<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
							 | 
						||
| 
								 | 
							
								<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
							 | 
						||
| 
								 | 
							
								<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								template <class Dereferenceable>
							 | 
						||
| 
								 | 
							
								struct indirect_reference
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef /* see below */ type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Requires:</th><td class="field-body">For an object <tt class="literal"><span class="pre">x</span></tt> of type <tt class="literal"><span class="pre">Dereferenceable</span></tt>, <tt class="literal"><span class="pre">*x</span></tt>
							 | 
						||
| 
								 | 
							
								is well-formed.  If <tt class="literal"><span class="pre">++x</span></tt> is ill-formed it shall neither be
							 | 
						||
| 
								 | 
							
								ambiguous nor shall it violate access control, and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">pointee<Dereferenceable>::type&</span></tt> shall be well-formed.
							 | 
						||
| 
								 | 
							
								Otherwise <tt class="literal"><span class="pre">iterator_traits<Dereferenceable>::reference</span></tt> shall
							 | 
						||
| 
								 | 
							
								be well formed.  [Note: These requirements need not apply to
							 | 
						||
| 
								 | 
							
								explicit or partial specializations of <tt class="literal"><span class="pre">indirect_reference</span></tt>]</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p><tt class="literal"><span class="pre">type</span></tt> is determined according to the following algorithm, where
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">x</span></tt> is an object of type <tt class="literal"><span class="pre">Dereferenceable</span></tt>:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								if ( ++x is ill-formed )
							 | 
						||
| 
								 | 
							
								    return ``pointee<Dereferenceable>::type&``
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    std::iterator_traits<Dereferenceable>::reference
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<p>See proposed resolution to Issue 9.37x for more changes related to
							 | 
						||
| 
								 | 
							
								this issue.</p>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="y-n1530-typos-and-editorial-changes-in-proposal-text-not-standardese">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id47" name="y-n1530-typos-and-editorial-changes-in-proposal-text-not-standardese">9.45y N1530: Typos and editorial changes in proposal text (not standardese)</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<ol class="arabic">
							 | 
						||
| 
								 | 
							
								<li><p class="first">"because specification helps to highlight that the <tt class="literal"><span class="pre">Reference</span></tt>
							 | 
						||
| 
								 | 
							
								template parameter may not always be identical to the iterator's
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">reference</span></tt> type, and will keep users making mistakes based on
							 | 
						||
| 
								 | 
							
								that assumption."</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first last">add "from" before "making"</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								<li><p class="first">mention of obsolete projection_iterator</p>
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								</ol>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed Resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">From n1530, in the <strong>Specialized Adaptors</strong> section, remove:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">projection_iterator</span></tt>, which is similar to <tt class="literal"><span class="pre">transform_iterator</span></tt>
							 | 
						||
| 
								 | 
							
								except that when dereferenced it returns a reference instead of
							 | 
						||
| 
								 | 
							
								a value.</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Rationale:</th><td class="field-body">This iterator was in the original boost library, but the new
							 | 
						||
| 
								 | 
							
								iterator concepts allowed this iterator to be
							 | 
						||
| 
								 | 
							
								folded into <tt class="literal"><span class="pre">transform_iterator</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="y-n1530-base-return-by-value-is-costly">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id48" name="y-n1530-base-return-by-value-is-costly">9.46y N1530: <tt class="literal"><span class="pre">base()</span></tt> return-by-value is costly</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Dave Abrahams</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>We've had some real-life reports that iterators that use
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="literal"><span class="pre">base()</span></tt> function can be inefficient
							 | 
						||
| 
								 | 
							
								when the <tt class="literal"><span class="pre">Base</span></tt> iterator is expensive to copy.  Iterators, of
							 | 
						||
| 
								 | 
							
								all things, should be efficient.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">In [lib.iterator.adaptor]</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Base base() const;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<pre class="literal-block">
							 | 
						||
| 
								 | 
							
								Base const& base() const;
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								<p class="last">twice (once in the synopsis and once in the <strong>public
							 | 
						||
| 
								 | 
							
								operations</strong> section).</p>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-forgot-default-constructible-in-forward-traversal-iterator">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id49" name="x-forgot-default-constructible-in-forward-traversal-iterator">9.47x Forgot default constructible in Forward Traversal Iterator</a></h2>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name">Submitter:</th><td class="field-body">Jeremy Siek</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								<p>We want Forward Traversal Iterator plus Readable Lvalue Iterator to
							 | 
						||
| 
								 | 
							
								match the old Foward Iterator requirements, so we need Forward
							 | 
						||
| 
								 | 
							
								Traversal Iterator to include Default Constructible.</p>
							 | 
						||
| 
								 | 
							
								<table class="field-list" frame="void" rules="none">
							 | 
						||
| 
								 | 
							
								<col class="field-name" />
							 | 
						||
| 
								 | 
							
								<col class="field-body" />
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr class="field"><th class="field-name" colspan="2">Proposed resolution:</th></tr>
							 | 
						||
| 
								 | 
							
								<tr><td> </td><td class="field-body"><p class="first">Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Forward Traversal Iterator</em>
							 | 
						||
| 
								 | 
							
								concept if the following expressions are valid and respect the stated
							 | 
						||
| 
								 | 
							
								semantics.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="44%" />
							 | 
						||
| 
								 | 
							
								<col width="39%" />
							 | 
						||
| 
								 | 
							
								<col width="17%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td colspan="3">Forward Traversal Iterator Requirements (in addition to Single Pass Iterator)</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote class="last">
							 | 
						||
| 
								 | 
							
								<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Forward Traversal Iterator</em>
							 | 
						||
| 
								 | 
							
								concept if, in addition to <tt class="literal"><span class="pre">X</span></tt> meeting the requirements of
							 | 
						||
| 
								 | 
							
								Default Constructible and Single Pass Iterator, the following
							 | 
						||
| 
								 | 
							
								expressions are valid and respect the
							 | 
						||
| 
								 | 
							
								stated semantics.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="38%" />
							 | 
						||
| 
								 | 
							
								<col width="34%" />
							 | 
						||
| 
								 | 
							
								<col width="27%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td colspan="3">Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-editorial-changes-non-normative-text">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id50" name="x-editorial-changes-non-normative-text">9.48x Editorial changes (non-normative text)</a></h2>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>Iterator facade uses the Curiously Recurring Template Pattern (CRTP)
							 | 
						||
| 
								 | 
							
								[Cop95] so that the user can specify the behavior of
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt> in a derived class.  Former designs used policy
							 | 
						||
| 
								 | 
							
								objects to specify the behavior.  <tt class="literal"><span class="pre">iterator_facade</span></tt> does not use policy
							 | 
						||
| 
								 | 
							
								objects for several reasons:</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>Iterator facade uses the Curiously Recurring Template
							 | 
						||
| 
								 | 
							
								Pattern (CRTP) [Cop95] so that the user can specify the behavior
							 | 
						||
| 
								 | 
							
								of <tt class="literal"><span class="pre">iterator_facade</span></tt> in a derived class.  Former designs used
							 | 
						||
| 
								 | 
							
								policy objects to specify the behavior, but that approach was
							 | 
						||
| 
								 | 
							
								discarded for several reasons:</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>iterator's <tt class="literal"><span class="pre">operator++</span></tt> returns the iterator type itself means
							 | 
						||
| 
								 | 
							
								that all iterators generated by <tt class="literal"><span class="pre">iterator_facade</span></tt> would be
							 | 
						||
| 
								 | 
							
								instantiations of <tt class="literal"><span class="pre">iterator_facade</span></tt>.  Cumbersome type generator</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>iterator's <tt class="literal"><span class="pre">operator++</span></tt> returns the iterator type itself
							 | 
						||
| 
								 | 
							
								would mean that all iterators built with the library would
							 | 
						||
| 
								 | 
							
								have to be specializations of <tt class="literal"><span class="pre">iterator_facade<...></span></tt>, rather
							 | 
						||
| 
								 | 
							
								than something more descriptive like
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">indirect_iterator<T*></span></tt>.  Cumbersome type generator</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The return type for <tt class="literal"><span class="pre">operator-></span></tt> and <tt class="literal"><span class="pre">operator[]</span></tt> is not
							 | 
						||
| 
								 | 
							
								explicitly specified. Instead it requires each <tt class="literal"><span class="pre">iterator_facade</span></tt>
							 | 
						||
| 
								 | 
							
								instantiation to meet the requirements of its <tt class="literal"><span class="pre">iterator_category</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>To:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The return types for <tt class="literal"><span class="pre">iterator_facade</span></tt>'s <tt class="literal"><span class="pre">operator-></span></tt> and
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">operator[]</span></tt> are not explicitly specified. Instead, those types
							 | 
						||
| 
								 | 
							
								are described in terms of a set of requirements, which must be
							 | 
						||
| 
								 | 
							
								satisfied by the <tt class="literal"><span class="pre">iterator_facade</span></tt> implementation.</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<div class="section" id="x-clarification-of-iterator-facade-requirements-and-type-members">
							 | 
						||
| 
								 | 
							
								<h2><a class="toc-backref" href="#id51" name="x-clarification-of-iterator-facade-requirements-and-type-members">9.49x Clarification of iterator_facade requirements and type members</a></h2>
							 | 
						||
| 
								 | 
							
								<p>A general cleanup and simplification of the requirements and
							 | 
						||
| 
								 | 
							
								description of type members for <tt class="literal"><span class="pre">iterator_facade</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p>The user is only allowed to add <tt class="literal"><span class="pre">const</span></tt> as a qualifier.</p>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">typedef</span> <span class="pre">remove_cv<Value>::type</span> <span class="pre">value_type;</span></tt></dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">typedef</span> <span class="pre">remove_const<Value>::type</span> <span class="pre">value_type;</span></tt></dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>We use to have an unspecified type for <tt class="literal"><span class="pre">pointer</span></tt>, to match the
							 | 
						||
| 
								 | 
							
								return type of <tt class="literal"><span class="pre">operator-></span></tt>, but there's no real reason to make them
							 | 
						||
| 
								 | 
							
								match, so we just use the simpler <tt class="literal"><span class="pre">Value*</span></tt> for <tt class="literal"><span class="pre">pointer</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">typedef</span> <span class="pre">/*</span> <span class="pre">see</span> <span class="pre">description</span> <span class="pre">of</span> <span class="pre">operator-></span> <span class="pre">*/</span> <span class="pre">pointer;</span></tt></blockquote>
							 | 
						||
| 
								 | 
							
								<dl>
							 | 
						||
| 
								 | 
							
								<dt>To:</dt>
							 | 
						||
| 
								 | 
							
								<dd><tt class="literal"><span class="pre">typedef</span> <span class="pre">Value*</span> <span class="pre">pointer;</span></tt></dd>
							 | 
						||
| 
								 | 
							
								<dt>Remove:</dt>
							 | 
						||
| 
								 | 
							
								<dd>Some of the constraints on template parameters to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt> are expressed in terms of resulting nested
							 | 
						||
| 
								 | 
							
								types and should be viewed in the context of their impact on
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_traits<Derived></span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>Change:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The <tt class="literal"><span class="pre">Derived</span></tt> template parameter must be a class derived from
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>and:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The following table describes the other requirements on the
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Derived</span></tt> parameter.  Depending on the resulting iterator's
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_category</span></tt>, a subset of the expressions listed in the table
							 | 
						||
| 
								 | 
							
								are required to be valid.  The operations in the first column must be
							 | 
						||
| 
								 | 
							
								accessible to member functions of class <tt class="literal"><span class="pre">iterator_core_access</span></tt>.</dd>
							 | 
						||
| 
								 | 
							
								<dt>to:</dt>
							 | 
						||
| 
								 | 
							
								<dd>The following table describes the typical valid expressions on
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_facade</span></tt>'s <tt class="literal"><span class="pre">Derived</span></tt> parameter, depending on the
							 | 
						||
| 
								 | 
							
								iterator concept(s) it will model.  The operations in the first
							 | 
						||
| 
								 | 
							
								column must be made accessible to member functions of class
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">iterator_core_access</span></tt>.  In addition,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">static_cast<Derived*>(iterator_facade*)</span></tt> shall be well-formed.</dd>
							 | 
						||
| 
								 | 
							
								<dt>Remove:</dt>
							 | 
						||
| 
								 | 
							
								<dd><p class="first">The nested <tt class="literal"><span class="pre">::value_type</span></tt> type will be the same as
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">remove_cv<Value>::type</span></tt>, so the <tt class="literal"><span class="pre">Value</span></tt> parameter must be
							 | 
						||
| 
								 | 
							
								an (optionally <tt class="literal"><span class="pre">const</span></tt>-qualified) non-reference type.</p>
							 | 
						||
| 
								 | 
							
								<p class="last">The nested <tt class="literal"><span class="pre">::reference</span></tt> will be the same as the <tt class="literal"><span class="pre">Reference</span></tt>
							 | 
						||
| 
								 | 
							
								parameter; it must be a suitable reference type for the resulting
							 | 
						||
| 
								 | 
							
								iterator.  The default for the <tt class="literal"><span class="pre">Reference</span></tt> parameter is
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">Value&</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								</dd>
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								<p>Change:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>In the table below, <tt class="literal"><span class="pre">X</span></tt> is the derived iterator type, <tt class="literal"><span class="pre">a</span></tt> is an
							 | 
						||
| 
								 | 
							
								object of type <tt class="literal"><span class="pre">X</span></tt>, <tt class="literal"><span class="pre">b</span></tt> and <tt class="literal"><span class="pre">c</span></tt> are objects of type <tt class="literal"><span class="pre">const</span> <span class="pre">X</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">n</span></tt> is an object of <tt class="literal"><span class="pre">X::difference_type</span></tt>, <tt class="literal"><span class="pre">y</span></tt> is a constant
							 | 
						||
| 
								 | 
							
								object of a single pass iterator type interoperable with X, and <tt class="literal"><span class="pre">z</span></tt>
							 | 
						||
| 
								 | 
							
								is a constant object of a random access traversal iterator type
							 | 
						||
| 
								 | 
							
								interoperable with <tt class="literal"><span class="pre">X</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="19%" />
							 | 
						||
| 
								 | 
							
								<col width="18%" />
							 | 
						||
| 
								 | 
							
								<col width="36%" />
							 | 
						||
| 
								 | 
							
								<col width="26%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Assertion/Note</th>
							 | 
						||
| 
								 | 
							
								<th>Required to implement
							 | 
						||
| 
								 | 
							
								Iterator Concept(s)</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.dereference()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">X::reference</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Readable Iterator, Writable
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.equal(b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to bool</td>
							 | 
						||
| 
								 | 
							
								<td>true iff <tt class="literal"><span class="pre">b</span></tt> and <tt class="literal"><span class="pre">c</span></tt> are
							 | 
						||
| 
								 | 
							
								equivalent.</td>
							 | 
						||
| 
								 | 
							
								<td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.equal(y)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to bool</td>
							 | 
						||
| 
								 | 
							
								<td>true iff <tt class="literal"><span class="pre">c</span></tt> and <tt class="literal"><span class="pre">y</span></tt> refer to the
							 | 
						||
| 
								 | 
							
								same position.  Implements <tt class="literal"><span class="pre">c</span> <span class="pre">==</span> <span class="pre">y</span></tt>
							 | 
						||
| 
								 | 
							
								and <tt class="literal"><span class="pre">c</span> <span class="pre">!=</span> <span class="pre">y</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								<td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.advance(n)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.increment()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Incrementable Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.decrement()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Bidirectional Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								X::difference_type</td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to <tt class="literal"><span class="pre">distance(c,</span> <span class="pre">b)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(z)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								X::difference_type</td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to <tt class="literal"><span class="pre">distance(c,</span> <span class="pre">z)</span></tt>.
							 | 
						||
| 
								 | 
							
								Implements <tt class="literal"><span class="pre">c</span> <span class="pre">-</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span> <span class="pre"><</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span>
							 | 
						||
| 
								 | 
							
								<span class="pre"><=</span> <span class="pre">z</span></tt>, <tt class="literal"><span class="pre">c</span> <span class="pre">></span> <span class="pre">z</span></tt>, and <tt class="literal"><span class="pre">c</span> <span class="pre">>=</span> <span class="pre">c</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								<p>to:</p>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<p>In the table below, <tt class="literal"><span class="pre">F</span></tt> is <tt class="literal"><span class="pre">iterator_facade<X,V,C,R,D></span></tt>, <tt class="literal"><span class="pre">a</span></tt> is an
							 | 
						||
| 
								 | 
							
								object of type <tt class="literal"><span class="pre">X</span></tt>, <tt class="literal"><span class="pre">b</span></tt> and <tt class="literal"><span class="pre">c</span></tt> are objects of type <tt class="literal"><span class="pre">const</span> <span class="pre">X</span></tt>,
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">n</span></tt> is an object of <tt class="literal"><span class="pre">F::difference_type</span></tt>, <tt class="literal"><span class="pre">y</span></tt> is a constant
							 | 
						||
| 
								 | 
							
								object of a single pass iterator type interoperable with <tt class="literal"><span class="pre">X</span></tt>, and <tt class="literal"><span class="pre">z</span></tt>
							 | 
						||
| 
								 | 
							
								is a constant object of a random access traversal iterator type
							 | 
						||
| 
								 | 
							
								interoperable with <tt class="literal"><span class="pre">X</span></tt>.</p>
							 | 
						||
| 
								 | 
							
								<p><strong>iterator_facade Core Operations</strong></p>
							 | 
						||
| 
								 | 
							
								<table border class="table">
							 | 
						||
| 
								 | 
							
								<colgroup>
							 | 
						||
| 
								 | 
							
								<col width="21%" />
							 | 
						||
| 
								 | 
							
								<col width="23%" />
							 | 
						||
| 
								 | 
							
								<col width="27%" />
							 | 
						||
| 
								 | 
							
								<col width="29%" />
							 | 
						||
| 
								 | 
							
								</colgroup>
							 | 
						||
| 
								 | 
							
								<thead valign="bottom">
							 | 
						||
| 
								 | 
							
								<tr><th>Expression</th>
							 | 
						||
| 
								 | 
							
								<th>Return Type</th>
							 | 
						||
| 
								 | 
							
								<th>Assertion/Note</th>
							 | 
						||
| 
								 | 
							
								<th>Used to implement Iterator
							 | 
						||
| 
								 | 
							
								Concept(s)</th>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody valign="top">
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.dereference()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td><tt class="literal"><span class="pre">F::reference</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Readable Iterator, Writable
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.equal(y)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to bool</td>
							 | 
						||
| 
								 | 
							
								<td>true iff <tt class="literal"><span class="pre">c</span></tt> and <tt class="literal"><span class="pre">y</span></tt>
							 | 
						||
| 
								 | 
							
								refer to the same
							 | 
						||
| 
								 | 
							
								position.</td>
							 | 
						||
| 
								 | 
							
								<td>Single Pass Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.increment()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Incrementable Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.decrement()</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Bidirectional Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">a.advance(n)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>unused</td>
							 | 
						||
| 
								 | 
							
								<td> </td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr><td><tt class="literal"><span class="pre">c.distance_to(z)</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>convertible to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">F::difference_type</span></tt></td>
							 | 
						||
| 
								 | 
							
								<td>equivalent to
							 | 
						||
| 
								 | 
							
								<tt class="literal"><span class="pre">distance(c,</span> <span class="pre">X(z))</span></tt>.</td>
							 | 
						||
| 
								 | 
							
								<td>Random Access Traversal
							 | 
						||
| 
								 | 
							
								Iterator</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								<hr class="footer" />
							 | 
						||
| 
								 | 
							
								<div class="footer">
							 | 
						||
| 
								 | 
							
								<a class="reference" href="iter-issue-list.rst">View document source</a>.
							 | 
						||
| 
								 | 
							
								Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								</body>
							 | 
						||
| 
								 | 
							
								</html>
							 |