<html>
    <head>
        <title>C++ Standard Library Active Issues List</title>
    </head>
    <body bgcolor="#ffffff" text="#000000">
        <table>
            <tr>
                <td>Doc. no.</td><td>J16/01-0005 = WG21 N1291</td>
            </tr>
            <tr>
                <td>Date:</td><td>20 Mar 2001</td>
            </tr>
            <tr>
                <td>Project:</td><td>Programming Language C++</td>
            </tr>
            <tr>
                <td>Reply to:</td><td>Matt Austern &lt;austern@research.att.com&gt;</td>
            </tr>
        </table>
        <h1>C++ Standard Library Active Issues List
       (Revision 17)
     </h1>
        <p>Reference ISO/IEC IS 14882:1998(E)</p>
        <p>Also see:</p>
        <ul>
            <li>
                <a href="lwg-toc.html">Table of Contents</a> for all library issues.</li>
            <li>
                <a href="lwg-index.html">Index by Section</a> for all library issues.</li>
            <li>
                <a href="lwg-status.html">Index by Status</a> for all library issues.</li>
            <li>
                <a href="lwg-defects.html">Library Defect Report List</a>
            </li>
            <li>
                <a href="lwg-closed.html">Library Closed Issues List</a>
            </li>
        </ul>
        <p>The purpose of this document is to record the status of issues
  which have come before the Library Working Group (LWG) of the ANSI
  (J16) and ISO (WG21) C++ Standards Committee. Issues represent
  potential defects in the ISO/IEC IS 14882:1998(E) document.  Issues
  are not to be used to request new features or other extensions. </p>
        <p>This document contains only library issues which are actively being
  considered by the Library Working Group. That is, issues which have a
  status of <a href="#New">New</a>, <a href="#Open">Open</a>, <a href="#Ready">Review</a>, and <a href="#Review">Ready</a>. See
  "<a href="lwg-defects.html">C++ Standard Library Defect Report
  List</a>" for issues considered defects and "<a href="lwg-closed.html">C++ Standard Library Closed Issues
  List</a>" for issues considered closed.</p>
        <p>The issues in these lists are not necessarily formal ISO Defect
  Reports (DR's). While some issues will eventually be elevated to
  official Defect Report status, other issues will be disposed of in
  other ways. See <a href="#Status">Issue Status</a>.</p>
        <p>This document is in an experimental format designed for both
  viewing via a world-wide web browser and hard-copy printing. It
  is available as an HTML file for browsing or PDF file for
  printing.</p>
        <p>Prior to Revision 14, library issues lists existed in two slightly
  different versions; a Committee Version and a Public
  Version. Beginning with Revision 14 the two versions were combined
  into a single version.</p>
        <p>This document includes <i>[bracketed italicized notes]</i> as a
  reminder to the LWG of current progress on issues. Such notes are
  strictly unofficial and should be read with caution as they may be
  incomplete or incorrect. Be aware that LWG support for a particular
  resolution can quickly change if new viewpoints or killer examples are
  presented in subsequent discussions.</p>
        <p>For the most current version of this document see <a href="http://www.dkuug.dk/jtc1/sc22/wg21">http://www.dkuug.dk/jtc1/sc22/wg21</a>. Requests
  for further information about this document should include the
  document number above, reference ISO/IEC 14882:1998(E), and be
  submitted to Information Technology Industry Council (ITI), 1250 Eye
  Street NW, Washington, DC 20005.</p>
        <p>Public information as to how to obtain a copy of the C++ Standard,
  join the standards committee, submit an issue, or comment on an issue
  can be found in the C++ FAQ at <a href="http://www.research.att.com/~austern/csc/faq.html">http://www.research.att.com/~austern/csc/faq.html</a>.
  Public discussion of C++ Standard related issues occurs on <a href="news:comp.std.c++">news:comp.std.c++</a>.
  </p>
        <p>For committee members, files available on the committee's private
  web site include the HTML version of the Standard itself. HTML
  hyperlinks from this issues list to those files will only work for
  committee members who have downloaded them into the same disk
  directory as the issues list files.  </p>
        <h2>Revision History</h2>
        <ul>
            <li>R17: 
Pre-Copenhagen mailing.  Converted issues list to XML.  Added proposed
resolutions for issues <a href="lwg-active.html#49">49</a>, <a href="lwg-active.html#76">76</a>, <a href="lwg-active.html#91">91</a>, <a href="lwg-active.html#235">235</a>, <a href="lwg-active.html#250">250</a>, <a href="lwg-active.html#267">267</a>.
Added new issues <a href="lwg-active.html#278">278</a>-<a href="lwg-active.html#311">311</a>.
</li>
            <li>R16:  
post-Toronto mailing; reflects actions taken in Toronto. Added new
issues <a href="lwg-active.html#265">265</a>-<a href="lwg-active.html#277">277</a>.  Changed status of issues
<a href="lwg-defects.html#3">3</a>, <a href="lwg-defects.html#8">8</a>, <a href="lwg-defects.html#9">9</a>, <a href="lwg-defects.html#19">19</a>,
<a href="lwg-defects.html#26">26</a>, <a href="lwg-defects.html#31">31</a>, <a href="lwg-defects.html#61">61</a>,
<a href="lwg-defects.html#63">63</a>, <a href="lwg-defects.html#86">86</a>, <a href="lwg-defects.html#108">108</a>,
<a href="lwg-defects.html#112">112</a>, <a href="lwg-defects.html#114">114</a>, <a href="lwg-defects.html#115">115</a>,
<a href="lwg-defects.html#122">122</a>, <a href="lwg-defects.html#127">127</a>, <a href="lwg-defects.html#129">129</a>,
<a href="lwg-defects.html#134">134</a>, <a href="lwg-defects.html#137">137</a>, <a href="lwg-defects.html#142">142</a>,
<a href="lwg-defects.html#144">144</a>, <a href="lwg-defects.html#146">146</a>, <a href="lwg-defects.html#147">147</a>,
<a href="lwg-defects.html#159">159</a>, <a href="lwg-defects.html#164">164</a>, <a href="lwg-defects.html#170">170</a>,
<a href="lwg-defects.html#181">181</a>, <a href="lwg-defects.html#199">199</a>, <a href="lwg-defects.html#208">208</a>,
<a href="lwg-defects.html#209">209</a>, <a href="lwg-defects.html#210">210</a>, <a href="lwg-defects.html#211">211</a>,
<a href="lwg-defects.html#212">212</a>, <a href="lwg-defects.html#217">217</a>, <a href="lwg-defects.html#220">220</a>,
<a href="lwg-defects.html#222">222</a>, <a href="lwg-defects.html#223">223</a>, <a href="lwg-defects.html#224">224</a>,
<a href="lwg-defects.html#227">227</a> to "DR".  Reopened issue <a href="lwg-active.html#23">23</a>. Reopened
issue <a href="lwg-active.html#187">187</a>. Changed issues <a href="lwg-closed.html#2">2</a> and
<a href="lwg-closed.html#4">4</a> to NAD. Fixed a typo in issue <a href="lwg-defects.html#17">17</a>. Fixed
issue <a href="lwg-defects.html#70">70</a>: signature should be changed both places it
appears. Fixed issue <a href="lwg-defects.html#160">160</a>: previous version didn't fix
the bug in enough places.
</li>
            <li>R15: 
pre-Toronto mailing. Added issues
<a href="lwg-active.html#233">233</a>-<a href="lwg-active.html#264">264</a>. Some small HTML formatting
changes so that we pass Weblint tests.
</li>
            <li>R14: 
post-Tokyo II mailing; reflects committee actions taken in
Tokyo. Added issues <a href="lwg-active.html#228">228</a> to <a href="lwg-active.html#232">232</a>. (00-0019R1/N1242)
</li>
            <li>R13: 
pre-Tokyo II updated: Added issues <a href="lwg-defects.html#212">212</a> to <a href="lwg-defects.html#227">227</a>.
</li>
            <li>R12: 
pre-Tokyo II mailing: Added issues <a href="lwg-defects.html#199">199</a> to
<a href="lwg-defects.html#211">211</a>. Added "and paragraph 5" to the proposed resolution
of issue <a href="lwg-defects.html#29">29</a>.  Add further rationale to issue
<a href="lwg-closed.html#178">178</a>.
</li>
            <li>R11: 
post-Kona mailing: Updated to reflect LWG and full committee actions
in Kona (99-0048/N1224). Note changed resolution of issues
<a href="lwg-closed.html#4">4</a> and <a href="lwg-defects.html#38">38</a>. Added issues <a href="lwg-closed.html#196">196</a>
to <a href="lwg-active.html#198">198</a>. Closed issues list split into "defects" and
"closed" documents.  Changed the proposed resolution of issue
<a href="lwg-closed.html#4">4</a> to NAD, and changed the wording of proposed resolution
of issue <a href="lwg-defects.html#38">38</a>.
</li>
            <li>R10: 
pre-Kona updated.  Added proposed resolutions <a href="lwg-defects.html#83">83</a>,
<a href="lwg-defects.html#86">86</a>, <a href="lwg-active.html#91">91</a>, <a href="lwg-active.html#92">92</a>,
<a href="lwg-active.html#109">109</a>. Added issues <a href="lwg-closed.html#190">190</a> to
<a href="lwg-defects.html#195">195</a>. (99-0033/D1209, 14 Oct 99)
</li>
            <li>R9: 
pre-Kona mailing.  Added issues <a href="lwg-closed.html#140">140</a> to
<a href="lwg-defects.html#189">189</a>. Issues list split into separate "active" and
"closed" documents. (99-0030/N1206, 25 Aug 99)
</li>
            <li>R8: 
post-Dublin mailing. Updated to reflect LWG and full committee actions
in Dublin. (99-0016/N1193, 21 Apr 99)
</li>
            <li>R7: 
pre-Dublin updated: Added issues <a href="lwg-closed.html#130">130</a>, <a href="lwg-closed.html#131">131</a>,
<a href="lwg-defects.html#132">132</a>, <a href="lwg-defects.html#133">133</a>, <a href="lwg-defects.html#134">134</a>,
<a href="lwg-closed.html#135">135</a>, <a href="lwg-active.html#136">136</a>, <a href="lwg-defects.html#137">137</a>,
<a href="lwg-closed.html#138">138</a>, <a href="lwg-defects.html#139">139</a> (31 Mar 99)
</li>
            <li>R6: 
pre-Dublin mailing. Added issues <a href="lwg-defects.html#127">127</a>, <a href="lwg-closed.html#128">128</a>,
and <a href="lwg-defects.html#129">129</a>.  (99-0007/N1194, 22 Feb 99)
</li>
            <li>R5: 
update issues <a href="lwg-active.html#103">103</a>, <a href="lwg-defects.html#112">112</a>; added issues
<a href="lwg-defects.html#114">114</a> to <a href="lwg-defects.html#126">126</a>. Format revisions to prepare
for making list public. (30 Dec 98)
</li>
            <li>R4: 
post-Santa Cruz II updated: Issues <a href="lwg-defects.html#110">110</a>,
<a href="lwg-active.html#111">111</a>, <a href="lwg-defects.html#112">112</a>, <a href="lwg-closed.html#113">113</a> added, several
issues corrected. (22 Oct 98)
</li>
            <li>R3: 
post-Santa Cruz II: Issues <a href="lwg-closed.html#94">94</a> to <a href="lwg-active.html#109">109</a>
added, many issues updated to reflect LWG consensus (12 Oct 98)
</li>
            <li>R2: 
pre-Santa Cruz II: Issues <a href="lwg-closed.html#73">73</a> to <a href="lwg-closed.html#93">93</a> added,
issue <a href="lwg-defects.html#17">17</a> updated. (29 Sep 98)
</li>
            <li>R1: 
Correction to issue <a href="lwg-defects.html#55">55</a> resolution, <a href="lwg-defects.html#60">60</a> code
format, <a href="lwg-defects.html#64">64</a> title. (17 Sep 98)
</li>
        </ul>
        <h2>
            <a name="Status"><b>Issue Status</b></a>
        </h2>
        <p>
            <b><a name="New">New</a></b> - The issue has not yet been
  reviewed by the LWG. Any <b>Proposed Resolution</b> is
  purely a suggestion from the issue submitter, and should not be
  construed as the view of LWG.</p>
        <p>
            <a name="Open"><b>Open</b></a> - The LWG has discussed
  the issue but is not yet ready to move the issue forward. There
  are several possible reasons for open status:</p>
        <ul>
            <li>Consensus may have not yet have been reached as to how to deal
    with the issue.</li>
            <li>Informal consensus may have been reached, but the LWG awaits
    exact <b>Proposed Resolution</b> wording for review.</li>
            <li>The LWG wishes to consult additional technical experts before
    proceeding.</li>
            <li>The issue may require further study.</li>
        </ul>
        <p>A <b>Proposed Resolution</b> for an open issue is still
  not be construed as the view of LWG. Comments on the current
  state of discussions are often given at the end of open issues in an
  italic font. Such comments are for information only and should not be
  given undue importance.</p>
        <p>
            <b><a name="Dup">Dup</a></b> - The LWG has reached
  consensus that the issue is a duplicate of another issue, and will not
  be further dealt with. A <b>Rationale</b> identities
  the duplicated issue's issue number.  </p>
        <p>
            <a name="NAD"><b>NAD</b></a> - The LWG has reached
  consensus that the issue is not a defect in the Standard, and the
  issue is ready to forward to the full committee as a proposed record
  of response. A <b>Rationale</b> discusses the LWG's
  reasoning.</p>
        <p>
            <a name="Review"><b>Review</b></a> - Exact wording of a
  <b>Proposed Resolution</b> is now available for review on an
  issue for which the LWG previously reached informal consensus.</p>
        <p>
            <a name="Ready"><b>Ready</b></a> - The LWG has reached
  consensus that the issue is a defect in the Standard, the
  <b>Proposed Resolution</b> is correct, and the issue is
  ready to forward to the full committee for further action as a Defect
  Report (DR).</p>
        <p>
            <a name="DR"><b>DR</b></a> - (Defect Report) - The full
  J16 committee has voted to forward the issue to the Project Editor to
  be processed as a Potential Defect Report. The Project Editor reviews
  the issue, and then forwards it to the WG21 Convenor, who returns it
  to the full committee for final disposition. This issues list
  accords the status of DR to all these Defect Reports regardless of
  where they are in that process.</p>
        <p>
            <b><a name="TC">TC</a></b> - (Technical Corrigenda) - The
  full WG21 committee has voted to accept the Defect Report's Proposed
  Resolution as a Technical Corrigenda.   Action on this issue is
  thus complete and no further action is possible under ISO rules.</p>
        <p>
            <a name="RR"><b>RR</b></a> - (Record of Response) - The
  full WG21 committee has determined that this issue is not a defect in
  the Standard. Action on this issue is thus complete and no further
  action is possible under ISO rules.</p>
        <p>
            <a name="Future"><b>Future</b></a> - In addition to the
  regular status, the LWG believes that this issue should be revisited
  at the next revision of the standard.  It is usually paired
  with NAD.</p>
        <p>Issues are always given the status of <a href="#New">New</a> when
  they first appear on the issues list. They may progress to <a href="#Open">Open</a> or <a href="#Review">Review</a> while the LWG is
  actively working on them. When the LWG has reached consensus on the
  disposition of an issue, the status will then change to <a href="#Dup">Dup</a>, <a href="#NAD">NAD</a>, or <a href="#Ready">Ready</a> as appropriate.  Once the full J16 committee
  votes to forward Ready issues to the Project Editor, they are given
  the status of Defect Report ( <a href="#DR">DR</a>). These in turn may
  become the basis for Technical Corrigenda (<a href="#TC">TC</a>), or
  are closed without action other than a Record of Response (<a href="#RR">RR</a>).h The intent of this LWG process is that only
  issues which are truly defects in the Standard move to the formal ISO
  DR status.
  </p>
        <h2>
        </h2>
        <hr>
        <a name="23">
            <h3>23.&nbsp;Num_get overflow result</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.2.1.2 <a href="lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Nathan Myers <b>Date:</b>&nbsp;6 Aug 1998</p>
<p>The current description of numeric input does not account for the possibility of
overflow. This is an implicit result of changing the description to rely on the definition
of scanf() (which fails to report overflow), and conflicts with the documented behavior of
traditional and current implementations. </p>

<p>Users expect, when reading a character sequence that results in a value unrepresentable
in the specified type, to have an error reported. The standard as written does not permit
this. </p>

<p>
            <b>Further comments from Dietmar:</b>
        </p>

<p>
I don't feel comfortable with the proposed resolution to issue 23: It
kind of simplifies the issue to much. Here is what is going on:
</p>

<p>
Currently, the behavior of numeric overflow is rather counter intuitive
and hard to trace, so I will describe it briefly:
</p>

<ul>
  <li>
    According to 22.2.2.1.2 <a href="lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</a>
    paragraph 11 <tt>failbit</tt> is set if <tt>scanf()</tt> would
    return an input error; otherwise a value is converted to the rules
    of <tt>scanf</tt>.
  </li>
  <li> 
    <tt>scanf()</tt> is defined in terms of <tt>fscanf()</tt>. 
  </li>
  <li>
    <tt>fscanf()</tt> returns an input failure if during conversion no
    character matching the conversion specification could be extracted
    before reaching EOF. This is the only reason for <tt>fscanf()</tt>
    to fail due to an input error and clearly does not apply to the case
    of overflow.
  </li>
  <li>
    Thus, the conversion is performed according to the rules of
    <tt>fscanf()</tt> which basically says that <tt>strtod</tt>,
    <tt>strtol()</tt>, etc. are to be used for the conversion.
  </li>
  <li>
    The <tt>strtod()</tt>, <tt>strtol()</tt>, etc. functions consume as
    many matching characters as there are and on overflow continue to
    consume matching characters but also return a value identical to
    the maximum (or minimum for signed types if there was a leading minus)
    value of the corresponding type and set <tt>errno</tt> to <tt>ERANGE</tt>.
  </li>
  <li>
    Thus, according to the current wording in the standard, overflows
    can be detected! All what is to be done is to check <tt>errno</tt>
    after reading an element and, of course, clearing <tt>errno</tt>
    before trying a conversion. With the current wording, it can be
    detected whether the overflow was due to a positive or negative
    number for signed types.
  </li>
</ul>

<p>
Now the proposed resolution results in not modifying the value passed
as last argument if an overflow is encountered but <tt>failbit</tt>
is set. Checking <tt>errno</tt> for <tt>ERANGE</tt> still allows for
detection of an overflow but not what the sign was.
</p>

<p>
Actually, my problem is not that much with the sign but this is at least
making things worse... My problem is more that it is still necessary
to check <tt>errno</tt> for the error description. Thus, I propose the
following resolution:
</p>

<p>Change paragraph 11 from</p>

<blockquote>
<p>
                <b>-11-</b> <b>Stage 3:</b>
The result of stage 2 processing can be one of</p>

<ul>
<li>A sequence of <tt>char</tt>s
has been accumulated in stage 2 that is converted (according to the
rules of <tt>scanf)</tt> to a value of the type of <tt><i>val</i></tt>.
This value is stored in <tt><i>val</i></tt>  and
<tt>ios_base::goodbit</tt> is stored in  <tt><i>err</i></tt>.</li>

<li>The sequence of <tt>char</tt>s
accumulated in stage 2 would have caused scanf to report an input failure.
<tt>ios_base::failbit</tt> is assigned to <i>err</i>.</li>
</ul>
</blockquote>

<p>to become</p>

<blockquote>
<p>
                <b>-11-</b> <b>Stage 3:</b>
The result of stage 2 processing can be one of</p>

<ul>
<li>A sequence of <tt>char</tt>s
has been accumulated in stage 2 that is converted (according to the
rules of <tt>scanf)</tt> to a value of the type of <tt><i>val</i></tt>.
This value is stored in <tt><i>val</i></tt>. If the conversion reported 
an overflow error for the type of <tt><i>val</i></tt> (ie. 
<tt><i>errno</i></tt> would be set to <tt>ERANGE</tt> by the used 
conversion function) then <tt>ios_base::failbit</tt> is stored in 
<tt><i>err</i></tt>, otherwise <tt>ios_base::goodbit</tt> is stored in  
<tt><i>err</i></tt>.</li>

<li>The sequence of <tt>char</tt>s accumulated in stage 2 would have 
caused scanf to report an input failure. <tt>ios_base::failbit</tt>
is assigned to <i>err</i>.</li>
</ul>
</blockquote>

<p>
With this definition, overflow can be detected easily by storing a value
different from the maximum value in <tt><i>val</i></tt> and checking whether
this value was modified in case <tt>failbit</tt> is set: If it was, there
was an overflow error, otherwise some other input error occurred (under the
conditions for the second bullet <tt><i>val</i></tt> is not changed).
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 22.2.2.1.2 <a href="lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</a>, paragraph 11, second bullet item,
change </p>

<blockquote>
  <p>The sequence of chars accumulated in stage 2 would have caused scanf to report an input
  failure. </p>
</blockquote>

<p>to </p>

<blockquote>
  <p>The sequence of chars accumulated in stage 2 would have caused scanf to report an input
  failure, or the value of the sequence cannot be represented in the type of _val_. </p>
</blockquote>

<p>
            <i>[post-Toronto: "cannot be represented" is probably wrong:
infinity can be represented on an IEC559 platform, but 0.1 cannot be
represented exactly.  However, the alternate proposal may be wrong as
well.  It's not clear whether overflow (and underflow?) should always
be treated as errors.  This issue requires much more thought]</i>
        </p>

<hr>
        <a name="44">
            <h3>44.&nbsp;Iostreams use operator== on int_type values</h3>
        </a>
        <p>
            <b>Section:</b> 27 <a href="lib-iostreams.html#lib.input.output">[lib.input.output]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Nathan Myers <b>Date:</b>&nbsp;6 Aug 1998</p>
<p>Many of the specifications for iostreams specify that character
values or their int_type equivalents are compared using operators ==
or !=, though in other places traits::eq() or traits::eq_int_type is
specified to be used throughout. This is an inconsistency; we should
change uses of == and != to use the traits members instead. </p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[Kona: Nathan to supply proposed wording]</i>
        </p>

<p>
            <i>[
Tokyo: the LWG reaffirmed that this is a defect, and requires careful
review of clause 27 as the changes are context sensitive.
]</i>
        </p>

<hr>
        <a name="49">
            <h3>49.&nbsp;Underspecification of ios_base::sync_with_stdio</h3>
        </a>
        <p>
            <b>Section:</b> 27.4.2.4 <a href="lib-iostreams.html#lib.ios.members.static">[lib.ios.members.static]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;21 Jun 1998</p>
<p>Two problems</p>

<p>(1) 27.4.2.4 doesn't say what ios_base::sync_with_stdio(f)
returns. Does it return f, or does it return the previous
synchronization state? My guess is the latter, but the standard
doesn't say so.</p>

<p>(2) 27.4.2.4 doesn't say what it means for streams to be
synchronized with stdio.  Again, of course, I can make some
guesses. (And I'm unhappy about the performance implications of those
guesses, but that's another matter.)</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the following sentence in 27.4.2.4 <a href="lib-iostreams.html#lib.ios.members.static">[lib.ios.members.static]</a>
returns clause from:</p>

<blockquote>
  <p>
                <tt>true</tt> if the standard iostream objects (27.3) are
  synchronized and otherwise returns <tt>false</tt>.</p>
</blockquote>

<p>to:</p>

<blockquote>
  <p>
                <tt>true</tt> if the previous state of the standard iostream
  objects (27.3) was synchronized and otherwise returns
  <tt>false</tt>.</p>
</blockquote>

<p>Add the following immediately after 27.4.2.4 <a href="lib-iostreams.html#lib.ios.members.static">[lib.ios.members.static]</a>,
paragraph 2:</p>

<blockquote>
<p>When a standard iostream object str is <i>synchronized</i> with a
standard stdio stream f, the effect of inserting a character c by</p>
<pre>
  fputc(f, c);
</pre>

<p>is the same as the effect of</p>
<pre>
  str.rdbuf()-&gt;sputc(c)
</pre>

<p>for any sequence of characters; the effect of extracting a
character c by</p>
<pre>
  c = fgetc(f);
</pre>

<p>is the same as the effect of:</p>
<pre>
  c = str.rdbuf()-&gt;sbumpc(c);
</pre>

<p>for any sequences of characters; and the effect of pushing
back a character c by</p>
<pre>
  ungetc(c, f);
</pre>

<p>is the same as the effect of</p>
<pre>
  str.rdbuf()-&gt;sputbackc(c);
</pre>

<p>for any sequence of characters.  [<i>Footnote</i>: In practical
terms, synchronization usually means that a standard iostream object
and a standard stdio object share a buffer. <i>--End Footnote</i>]</p>
</blockquote>

<p>
            <i>[pre-Copenhagen: PJP and Matt contributed the definition
of "synchronization"]</i>
        </p>

<hr>
        <a name="76">
            <h3>76.&nbsp;Can a <tt>codecvt</tt> facet always convert one internal character at a time?</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.1.5 <a href="lib-locales.html#lib.locale.codecvt">[lib.locale.codecvt]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;25 Sep 1998</p>
<p>This issue concerns the requirements on classes derived from
<tt>codecvt</tt>, including user-defined classes. What are the
restrictions on the conversion from external characters
(e.g. <tt>char</tt>) to internal characters (e.g. <tt>wchar_t</tt>)?
Or, alternatively, what assumptions about <tt>codecvt</tt> facets can
the I/O library make? </p>

<p>The question is whether it's possible to convert from internal
characters to external characters one internal character at a time,
and whether, given a valid sequence of external characters, it's
possible to pick off internal characters one at a time. Or, to put it
differently: given a sequence of external characters and the
corresponding sequence of internal characters, does a position in the
internal sequence correspond to some position in the external
sequence? </p>

<p>To make this concrete, suppose that <tt>[first, last)</tt> is a
sequence of <i>M</i> external characters and that <tt>[ifirst,
ilast)</tt> is the corresponding sequence of <i>N</i> internal
characters, where <i>N &gt; 1</i>. That is, <tt>my_encoding.in()</tt>,
applied to <tt>[first, last)</tt>, yields <tt>[ifirst,
ilast)</tt>. Now the question: does there necessarily exist a
subsequence of external characters, <tt>[first, last_1)</tt>, such
that the corresponding sequence of internal characters is the single
character <tt>*ifirst</tt>?
</p>

<p>(What a "no" answer would mean is that
<tt>my_encoding</tt> translates sequences only as blocks. There's a
sequence of <i>M</i> external characters that maps to a sequence of
<i>N</i> internal characters, but that external sequence has no
subsequence that maps to <i>N-1</i> internal characters.) </p>

<p>Some of the wording in the standard, such as the description of
<tt>codecvt::do_max_length</tt> (22.2.1.5.2 <a href="lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</a>,
paragraph 11) and <tt>basic_filebuf::underflow</tt> (27.8.1.4 <a href="lib-iostreams.html#lib.filebuf.virtuals">[lib.filebuf.virtuals]</a>, paragraph 3) suggests that it must always be
possible to pick off internal characters one at a time from a sequence
of external characters. However, this is never explicitly stated one
way or the other. </p>

<p>This issue seems (and is) quite technical, but it is important if
we expect users to provide their own encoding facets. This is an area
where the standard library calls user-supplied code, so a well-defined
set of requirements for the user-supplied code is crucial. Users must
be aware of the assumptions that the library makes. This issue affects
positioning operations on <tt>basic_filebuf</tt>, unbuffered input,
and several of <tt>codecvt</tt>'s member functions. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add the following text as a new paragraph, following 22.2.1.5.2 <a href="lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</a> paragraph 2:</p>

<blockquote>
<p>If</p>
<pre>
    do_out(state, from, from_end, from_next, to, to_lim, to_next)
</pre>
would succeed (return value would be <tt>ok</tt>), and if 
<tt>from != from_end</tt>, then 
<pre>
    do_out(state, from, from + 1, from_next, to, to_end, to_next)
</pre>
must also succeed. If
<pre>
    do_in(state, from, from_end, from_next, to, to_lim, to_next)
</pre>
would succeed, and if <tt>to != to_lim</tt>, then
<pre>
    do_in(state, from, from_end, from_next, to, to + 1, to_next)
</pre>
<p>must also succeed.  [<i>Footnote:</i> Informally, this means that
every <tt>codecvt</tt> must be able to translate characters one
internal character at a time.  <i>--End Footnote</i>]</p>
</blockquote>

<p>
            <b>Rationale:</b>
        </p>

  <p>The proposed resoluion says that conversions can be performed one
  internal character at a time.  This rules out some encodings that
  would otherwise be legal.  The alternative answer would mean there
  would be some internal positions that do not correspond to any
  external file position.</p>
  <p>
  An example of an encoding that this rules out is one where the
  <tt>internT</tt> and <tt>externT</tt> are of the same type, and
  where the internal sequence <tt>c1 c2</tt> corresponds to the
  external sequence <tt>c2 c1</tt>.
  </p>

  <p>
            <i>[Pre-Copenhagen: Matt provided wording.]</i>
        </p>

<hr>
        <a name="91">
            <h3>91.&nbsp;Description of operator&gt;&gt; and getline() for string&lt;&gt; might cause endless loop</h3>
        </a>
        <p>
            <b>Section:</b> 21.3.7.9 <a href="lib-strings.html#lib.string.io">[lib.string.io]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Nico Josuttis <b>Date:</b>&nbsp;29 Sep 1998</p>
<p>Operator &gt;&gt; and getline() for strings read until eof()
in the input stream is true. However, this might never happen, if the
stream can't read anymore without reaching EOF. So shouldn't it be
changed into that it reads until !good() ? </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 21.3.7.9 <a href="lib-strings.html#lib.string.io">[lib.string.io]</a>, paragraph 1, replace:</p>
<blockquote>
Effects: Begins by constructing a sentry object k as if k were
constructed by typename basic_istream&lt;charT,traits&gt;::sentry k( is). If
bool( k) is true, it calls str.erase() and then extracts characters
from is and appends them to str as if by calling str.append(1, c). If
is.width() is greater than zero, the maximum number n of characters
appended is is.width(); otherwise n is str.max_size(). Characters are
extracted and appended until any of the following occurs:
</blockquote>
<p>with:</p>
<blockquote>
Effects: Behaves as a formatted input function (27.6.1.2 <a href="lib-iostreams.html#lib.istream.formatted">[lib.istream.formatted]</a>).
If the sentry converts to true, calls str.erase() and then extracts
characters from is and appends them to str as if by calling
str.append(1,c). If is.width() is greater than zero, the maximum
number n of characters appended is is.width(); otherwise n is
str.max_size(). Characters are extracted and appended until any of the
following occurs:
</blockquote>

<p>In 21.3.7.9 <a href="lib-strings.html#lib.string.io">[lib.string.io]</a>, paragraph 6, replace</p>
<blockquote>
Effects: Begins by constructing a sentry object k as if by typename
basic_istream&lt;charT,traits&gt;::sentry k( is, true). If bool( k) is true,
it calls str.erase() and then extracts characters from is and appends
them to str as if by calling str.append(1, c) until any of the
following occurs:
</blockquote>
<p>with:</p>
<blockquote>
Effects: Behaves as a formatted input function (27.6.1.2 <a href="lib-iostreams.html#lib.istream.formatted">[lib.istream.formatted]</a>).
If the sentry converts to true, calls str.erase() and then extracts
characters from is and appends them to str as if by calling
str.append(1,c) until any of the following occurs:
</blockquote>

<p>
            <i>[
pre-Copenhagen: Howard provided wording.
]</i>
        </p>

<p>
            <b>Rationale:</b>
        </p>
<p>The real issue here is whether or not these string input functions
perform formatted input.  If they do, then they get their characters
from a streambuf, rather than by calling an istream's member functions,
and a streambuf signals failure either by returning eof or by throwing
an exception.  The proposed resolution makes it clear that these two
functions do perform formatted input.</p>
<hr>
        <a name="92">
            <h3>92.&nbsp;Incomplete Algorithm Requirements</h3>
        </a>
        <p>
            <b>Section:</b> 25 <a href="lib-algorithms.html#lib.algorithms">[lib.algorithms]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Nico Josuttis <b>Date:</b>&nbsp;29 Sep 1998</p>
<p>The standard does not state, how often a function object is copied,
called, or the order of calls inside an algorithm. This may lead to
surprising/buggy behavior. Consider the following example: </p>

<pre>class Nth {    // function object that returns true for the nth element 
  private: 
    int nth;     // element to return true for 
    int count;   // element counter 
  public: 
    Nth (int n) : nth(n), count(0) { 
    } 
    bool operator() (int) { 
        return ++count == nth; 
    } 
}; 
.... 
// remove third element 
    list&lt;int&gt;::iterator pos; 
    pos = remove_if(coll.begin(),coll.end(),  // range 
                    Nth(3)),                  // remove criterion 
    coll.erase(pos,coll.end()); </pre>

<p>This call, in fact removes the 3rd <b>AND the 6th</b> element. This
happens because the usual implementation of the algorithm copies the
function object internally: </p>

<pre>template &lt;class ForwIter, class Predicate&gt; 
ForwIter std::remove_if(ForwIter beg, ForwIter end, Predicate op) 
{ 
    beg = find_if(beg, end, op); 
    if (beg == end) { 
        return beg; 
    } 
    else { 
        ForwIter next = beg; 
        return remove_copy_if(++next, end, beg, op); 
    } 
} </pre>

<p>The algorithm uses find_if() to find the first element that should
be removed. However, it then uses a copy of the passed function object
to process the resulting elements (if any). Here, Nth is used again
and removes also the sixth element. This behavior compromises the
advantage of function objects being able to have a state. Without any
cost it could be avoided (just implement it directly instead of
calling find_if()). </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p> In [lib.function.objects] 20.3 Function objects add as new
paragraph 6 (or insert after paragraph 1): </p>

<p>Option 1: </p>
<blockquote>
Predicates are functions or function objects that fulfill the
following requirements:<br> &nbsp; - They return a Boolean value (bool
or a value convertible to bool)<br> &nbsp; - It doesn't matter for the
behavior of a predicate how often it is copied or assigned and how
often it is called.
</blockquote>

<p>Option 2: </p>
<blockquote>
- if it's a function:<br> &nbsp; - All calls with the same
argument values yield the same result.<br> - if it's a function
object:<br> &nbsp; - In any sequence of calls to operator () without
calling any non-constant member function, all calls with the same
argument values yield the same result.&nbsp;<br> - After an assignment
or copy both objects return the same result for the same values. 
</blockquote>

<p>
            <i>[Santa Cruz: The LWG believes that there may be more to this than
meets the eye. It applies to all function objects, particularly
predicates. Two questions: (1) must a function object be
copyable? (2) how many times is a function object called?&nbsp; These
are in effect questions about state.&nbsp; Function objects appear to
require special copy semantics to make state work, and may fail if
calling alters state and calling occurs an unexpected number of
times.]</i>
        </p>

<p>
            <i>[Dublin: Pete Becker felt that this may not be a defect,
but rather something that programmers need to be educated about.
There was discussion of adding wording to the effect that the number
and order of calls to function objects, including predicates, not
affect the behavior of the function object.]</i>
        </p>

<p>
            <i>[Pre-Kona: Nico comments: It seems the problem is that we don't
have a clear statement of "predicate" in the
standard. People including me seemed to think "a function
returning a Boolean value and being able to be called by an STL
algorithm or be used as sorting criterion or ... is a
predicate". But a predicate has more requirements: It should
never change its behavior due to a call or being copied. IMHO we have
to state this in the standard. If you like, see section 8.1.4 of my
library book for a detailed discussion.]</i>
        </p>

<p>
            <i>[Kona: Nico will provide wording to the effect that "unless
otherwise specified, the number of copies of and calls to function
objects by algorithms is unspecified".&nbsp; Consider placing in
25 <a href="lib-algorithms.html#lib.algorithms">[lib.algorithms]</a> after paragraph 9.]</i>
        </p>

<p>
            <i>[Pre-Tokyo: Angelika Langer comments: if the resolution is
that algorithms are free to copy and pass around any function objects,
then it is a valid question whether they are also allowed to change
the type information from reference type to value type.]</i>
        </p>

<p>
            <i>[Tokyo: Nico will discuss this further with Matt as there are
multiple problems beyond the underlying problem of no definition of
"Predicate".]</i>
        </p>

<p>
            <i>[Post-Tokyo: Nico provided the above proposed
resolutions.]</i>
        </p>

<hr>
        <a name="96">
            <h3>96.&nbsp;Vector&lt;bool&gt; is not a container</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.5 <a href="lib-containers.html#lib.vector.bool">[lib.vector.bool]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;AFNOR <b>Date:</b>&nbsp;7 Oct 1998</p>
<p>
            <tt>vector&lt;bool&gt;</tt> is not a container as its reference and
pointer types are not references and pointers. </p>

<p>Also it forces everyone to have a space optimization instead of a
speed one.</p>

<p>
            <b>See also:</b> 99-0008 == N1185 Vector&lt;bool&gt; is
Nonconforming, Forces Optimization Choice.</p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[In Santa Cruz the LWG felt that this was Not A Defect.]</i>
        </p>

<p>
            <i>[In Dublin many present felt that failure to meet Container
requirements was a defect. There was disagreement as to whether
or not the optimization requirements constituted a defect.]</i>
        </p>

<p>
            <i>[The LWG looked at the following resolutions in some detail:
<br>
&nbsp;&nbsp;&nbsp;&nbsp; * Not A Defect.<br>
&nbsp;&nbsp;&nbsp;&nbsp; * Add a note explaining that vector&lt;bool&gt; does not meet
Container requirements.<br>
&nbsp;&nbsp;&nbsp;&nbsp; * Remove vector&lt;bool&gt;.<br>
&nbsp;&nbsp;&nbsp;&nbsp; * Add a new category of container requirements which
vector&lt;bool&gt; would meet.<br>
&nbsp;&nbsp;&nbsp;&nbsp; * Rename vector&lt;bool&gt;.<br>
<br>
No alternative had strong, wide-spread, support and every alternative
had at least one "over my dead body" response.<br>
<br>
There was also mention of a transition scheme something like (1) add
vector_bool and deprecate vector&lt;bool&gt; in the next standard. (2)
Remove vector&lt;bool&gt; in the following standard.]</i>
        </p>

<p>
            <i>[Modifying container requirements to permit returning proxies
(thus allowing container requirements conforming vector&lt;bool&gt;)
was also discussed.]</i>
        </p>

<p>
            <i>[It was also noted that there is a partial but ugly workaround in
that vector&lt;bool&gt; may be further specialized with a customer
allocator.]</i>
        </p>

<p>
            <i>[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211,
vector&lt;bool&gt;: More Problems, Better Solutions. Much discussion
of a two step approach: a) deprecate, b) provide replacement under a
new name.  LWG straw vote on that: 1-favor, 11-could live with, 2-over
my dead body.  This resolution was mentioned in the LWG report to the
full committee, where several additional committee members indicated
over-my-dead-body positions.]</i>
        </p>

<p>
            <i>[Tokyo: Not discussed by the full LWG; no one claimed new
insights and so time was more productively spent on other issues. In
private discussions it was asserted that requirements for any solution
include 1) Increasing the full committee's understanding of the
problem, and 2) providing compiler vendors, authors, teachers, and of
course users with specific suggestions as to how to apply the eventual
solution.]</i>
        </p>

<hr>
        <a name="98">
            <h3>98.&nbsp;Input iterator requirements are badly written</h3>
        </a>
        <p>
            <b>Section:</b> 24.1.1 <a href="lib-iterators.html#lib.input.iterators">[lib.input.iterators]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;AFNOR <b>Date:</b>&nbsp;7 Oct 1998</p>
<p>Table 72 in 24.1.1 <a href="lib-iterators.html#lib.input.iterators">[lib.input.iterators]</a> specifies semantics for
<tt>*r++</tt> of:</p>

<p>&nbsp;&nbsp; <tt>{ T tmp = *r; ++r; return tmp; }</tt>
        </p>

<p>This does not work for pointers and over constrains implementors.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add for *r++: To call the copy constructor for the type T is
allowed but not required.</p>

<p>
            <i>[Dublin: Pete Becker will attempt improved wording.]</i>
        </p>

<p>
            <i>[Tokyo: The essence of the issue seems to have escaped.
Pete will email Valentin to try to recapture it.]</i>
        </p>
<hr>
        <a name="103">
            <h3>103.&nbsp;set::iterator is required to be modifiable, but this allows modification of keys</h3>
        </a>
        <p>
            <b>Section:</b> 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;AFNOR <b>Date:</b>&nbsp;7 Oct 1998</p>
<p>Set::iterator is described as implementation-defined with a
reference to the container requirement; the container requirement says
that const_iterator is an iterator pointing to const T and iterator an
iterator pointing to T.</p>

<p>23.1.2 paragraph 2 implies that the keys should not be modified to
break the ordering of elements. But that is not clearly
specified. Especially considering that the current standard requires
that iterator for associative containers be different from
const_iterator. Set, for example, has the following: </p>

<p>
            <tt>typedef implementation defined iterator;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // See _lib.container.requirements_</tt>
        </p>

<p>23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a> actually requires that iterator type pointing
to T (table 65). Disallowing user modification of keys by changing the
standard to require an iterator for associative container to be the
same as const_iterator would be overkill since that will unnecessarily
significantly restrict the usage of associative container. A class to
be used as elements of set, for example, can no longer be modified
easily without either redesigning the class (using mutable on fields
that have nothing to do with ordering), or using const_cast, which
defeats requiring iterator to be const_iterator. The proposed solution
goes in line with trusting user knows what he is doing. </p>

<p>
            <b>Other Options Evaluated:</b> </p>

<p>Option A.&nbsp;&nbsp; In 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>, paragraph 2, after
first sentence, and before "In addition,...", add one line:
</p>

<blockquote>
  <p>Modification of keys shall not change their strict weak ordering. </p>
</blockquote>

<p>Option B.&nbsp;Add three new sentences to 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>:</p>

<blockquote>
  <p>At the end of paragraph 5: "Keys in an associative container
  are immutable." At the end of paragraph 6: "For
  associative containers where the value type is the same as the key
  type, both <tt>iterator</tt> and <tt>const_iterator</tt> are
  constant iterators. It is unspecified whether or not
  <tt>iterator</tt> and <tt>const_iterator</tt> are the same
  type."</p>
</blockquote>

<p>Option C.&nbsp;To 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>, paragraph 3, which
currently reads:</p>

<blockquote>
  <p>The phrase ``equivalence of keys'' means the equivalence relation imposed by the
  comparison and not the operator== on keys. That is, two keys k1 and k2 in the same
  container are considered to be equivalent if for the comparison object comp, comp(k1, k2)
  == false &amp;&amp; comp(k2, k1) == false.</p>
</blockquote>

<p>&nbsp; add the following:</p>

<blockquote>
  <p>For any two keys k1 and k2 in the same container, comp(k1, k2) shall return the same
  value whenever it is evaluated. [Note: If k2 is removed from the container and later
  reinserted, comp(k1, k2) must still return a consistent value but this value may be
  different than it was the first time k1 and k2 were in the same container. This is
  intended to allow usage like a string key that contains a filename, where comp compares
  file contents; if k2 is removed, the file is changed, and the same k2 (filename) is
  reinserted, comp(k1, k2) must again return a consistent value but this value may be
  different than it was the previous time k2 was in the container.]</p>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add the following to 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a> at
the indicated location:</p>

<blockquote>
  <p>At the end of paragraph 3: "For any two keys k1 and k2 in the same container,
  calling comp(k1, k2) shall always return the same
  value."</p>
  <p>At the end of paragraph 5: "Keys in an associative container are immutable."</p>
  <p>At the end of paragraph 6: "For associative containers where the value type is the
  same as the key type, both <tt>iterator</tt> and <tt>const_iterator</tt> are constant
  iterators. It is unspecified whether or not <tt>iterator</tt> and <tt>const_iterator</tt>
  are the same type."</p>
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>Several arguments were advanced for and against allowing set elements to be
mutable as long as the ordering was not effected. The argument which swayed the
LWG was one of safety; if elements were mutable, there would be no compile-time
way to detect of a simple user oversight which caused ordering to be
modified.  There was a report that this had actually happened in practice,
and had been painful to diagnose.  If users need to modify elements,
it is possible to use mutable members or const_cast.</p>

<p>Simply requiring that keys be immutable is not sufficient, because the comparison
object may indirectly (via pointers) operate on values outside of the keys.</p>

<p>
The types <tt>iterator</tt> and <tt>const_iterator</tt> are permitted
to be different types to allow for potential future work in which some
member functions might be overloaded between the two types.  No such
member functions exist now, and the LWG believes that user functionality
will not be impaired by permitting the two types to be the same.  A
function that operates on both iterator types can be defined for 
<tt>const_iterator</tt> alone, and can rely on the automatic
conversion from <tt>iterator</tt> to <tt>const_iterator</tt>.
</p>

<p>
            <i>[Tokyo: The LWG crafted the proposed resolution and rationale.]</i>
        </p>
<hr>
        <a name="109">
            <h3>109.&nbsp;Missing binders for non-const sequence elements</h3>
        </a>
        <p>
            <b>Section:</b> 20.3.6 <a href="lib-utilities.html#lib.binders">[lib.binders]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Bjarne Stroustrup <b>Date:</b>&nbsp;7 Oct 1998</p>
<p>There are no versions of binders that apply to non-const elements
of a sequence. This makes examples like for_each() using bind2nd() on
page 521 of "The C++ Programming Language (3rd)"
non-conforming. Suitable versions of the binders need to be added.</p>

<p>Further discussion from Nico:</p>

<p>What is probably meant here is shown in the following example:</p>

<pre>class Elem { 
  public: 
    void print (int i) const { } 
    void modify (int i) { } 
}; </pre>
<pre>int main() 
{ 
    vector&lt;Elem&gt; coll(2); 
    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&amp;Elem::print),42));    // OK 
    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&amp;Elem::modify),42));   // ERROR 
}</pre>

<p>The error results from the fact that bind2nd() passes its first
argument (the argument of the sequence) as constant reference. See the
following typical implementation:</p>

<blockquote>
  <pre>template &lt;class Operation&gt; 
class binder2nd 
  : public unary_function&lt;typename Operation::first_argument_type, 
                          typename Operation::result_type&gt; { 
protected: 
  Operation op; 
  typename Operation::second_argument_type value; 
public: 
  binder2nd(const Operation&amp; o, 
            const typename Operation::second_argument_type&amp; v) 
      : op(o), value(v) {} </pre>
  <pre> typename Operation::result_type 
  operator()(const typename Operation::first_argument_type&amp; x) const { 
    return op(x, value); 
  } 
};</pre>
</blockquote>

<p>The solution is to overload operator () of bind2nd for non-constant arguments:</p>

<blockquote>
  <pre>template &lt;class Operation&gt; 
class binder2nd 
  : public unary_function&lt;typename Operation::first_argument_type, 
                          typename Operation::result_type&gt; { 
protected: 
  Operation op; 
  typename Operation::second_argument_type value; 
public: 
  binder2nd(const Operation&amp; o, 
            const typename Operation::second_argument_type&amp; v) 
      : op(o), value(v) {} </pre>
  <pre> typename Operation::result_type 
  operator()(const typename Operation::first_argument_type&amp; x) const { 
    return op(x, value); 
  } 
  typename Operation::result_type 
  operator()(typename Operation::first_argument_type&amp; x) const { 
    return op(x, value); 
  } 
};</pre>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 20.3.6.1 <a href="lib-utilities.html#lib.binder.1st">[lib.binder.1st]</a> in the declaration of binder1st after:</p>
<blockquote>
  <p>
                <tt>typename Operation::result_type<br>
  &nbsp;operator()(const typename Operation::second_argument_type&amp; x) const;</tt>
            </p>
</blockquote>
<p>insert:</p>
<blockquote>
  <p>
                <tt>typename Operation::result_type<br>
  &nbsp;operator()(typename Operation::second_argument_type&amp; x) const;</tt>
            </p>
</blockquote>
<p>In 20.3.6.3 <a href="lib-utilities.html#lib.binder.2nd">[lib.binder.2nd]</a> in the declaration of binder2nd after:</p>
<blockquote>
  <p>
                <tt>typename Operation::result_type<br>
  &nbsp;operator()(const typename Operation::first_argument_type&amp; x) const;</tt>
            </p>
</blockquote>
<p>insert:</p>
<blockquote>
  <p>
                <tt>typename Operation::result_type<br>
  &nbsp;operator()(typename Operation::first_argument_type&amp; x) const;</tt>
            </p>
</blockquote>

<p>
            <i>[Kona: The LWG discussed this at some length.It was agreed that
this is a mistake in the design, but there was no consensus on whether
it was a defect in the Standard.  Straw vote: NAD - 5.  Accept
proposed resolution - 3.  Leave open - 6.]</i>
        </p>

<p>
            <i>[Tokyo: not discussed.]</i>
        </p>
<hr>
        <a name="111">
            <h3>111.&nbsp;istreambuf_iterator::equal overspecified, inefficient</h3>
        </a>
        <p>
            <b>Section:</b> 24.5.3.5 <a href="lib-iterators.html#lib.istreambuf.iterator::equal">[lib.istreambuf.iterator::equal]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Nathan Myers <b>Date:</b>&nbsp;15 Oct 1998</p>
<p>The member istreambuf_iterator&lt;&gt;::equal is specified to be
unnecessarily inefficient. While this does not affect the efficiency
of conforming implementations of iostreams, because they can
"reach into" the iterators and bypass this function, it does
affect users who use istreambuf_iterators. </p>

<p>The inefficiency results from a too-scrupulous definition, which
requires a "true" result if neither iterator is at eof. In
practice these iterators can only usefully be compared with the
"eof" value, so the extra test implied provides no benefit,
but slows down users' code. </p>

<p>The solution is to weaken the requirement on the function to return
true only if both iterators are at eof. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace 24.5.3.5 <a href="lib-iterators.html#lib.istreambuf.iterator::equal">[lib.istreambuf.iterator::equal]</a>,
paragraph 1, </p>

<blockquote>
  <p>-1- Returns: true if and only if both iterators are at end-of-stream, or neither is at
  end-of-stream, regardless of what streambuf object they use. </p>
</blockquote>

<p>with</p>

<blockquote>
  <p>-1- Returns: true if and only if both iterators are at
  end-of-stream, regardless of what streambuf object they use. </p>
</blockquote>

<p>
            <i>[Toronto: most people saw no compelling reason to make this
change.  There was some argument that the standard already permits
this behavior, on the grounds that it is illegal to have two different
<tt>istreambuf_iterator</tt>s into the same stream.  A possible
counterexample: "<tt>istreambuf_iterator i(cin); assert(i ==
i);</tt>".  The standard currently requires that the assertion
succeeds. (Assuming that we haven't reached eof on standard input, of
course.)]</i>
        </p>
<hr>
        <a name="117">
            <h3>117.&nbsp;<tt>basic_ostream</tt> uses nonexistent <tt>num_put</tt> member functions</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.2.5.2 <a href="lib-iostreams.html#lib.ostream.inserters.arithmetic">[lib.ostream.inserters.arithmetic]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;20 Nov 1998</p>
<p>The <b>effects</b> clause for numeric inserters says that
insertion of a value <tt>x</tt>, whose type is either <tt>bool</tt>,
<tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>, <tt>unsigned
int</tt>, <tt>long</tt>, <tt>unsigned long</tt>, <tt>float</tt>,
<tt>double</tt>, <tt>long double</tt>, or <tt>const void*</tt>, is
delegated to <tt>num_put</tt>, and that insertion is performed as if
through the following code fragment: </p>

<pre>bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt; 
   &gt;(getloc()).put(*this, *this, fill(), val). failed();</pre>

<p>This doesn't work, because <tt>num_put&lt;&gt;</tt>::put is only
overloaded for the types <tt>bool</tt>, <tt>long</tt>, <tt>unsigned
long</tt>, <tt>double</tt>, <tt>long double</tt>, and <tt>const
void*</tt>. That is, the code fragment in the standard is incorrect
(it is diagnosed as ambiguous at compile time) for the types
<tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>, <tt>unsigned
int</tt>, and <tt>float</tt>. </p>

<p>We must either add new member functions to <tt>num_put</tt>, or
else change the description in <tt>ostream</tt> so that it only calls
functions that are actually there. I prefer the latter. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace 27.6.2.5.2, paragraph 1 with the following: </p>

<blockquote>
<p>
The classes num_get&lt;&gt; and num_put&lt;&gt; handle locale&shy;dependent numeric
formatting and parsing.  These inserter functions use the imbued
locale value to perform numeric formatting.  When val is of type bool,
long, unsigned long, double, long double, or const void*, the
formatting conversion occurs as if it performed the following code
fragment:
</p>

<pre>
bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
   &gt;(getloc()).put(*this, *this, fill(), val). failed();
</pre>

<p>
When val is of type short the formatting conversion occurs as if it
performed the following code fragment:
</p>

<pre>
ios_base::fmtflags baseflags = ios_base::flags() &amp; ios_base::basefield;
bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
   &gt;(getloc()).put(*this, *this, fill(),
      baseflags == ios_base::oct || baseflags == ios_base::hex
         ? static_cast&lt;long&gt;(static_cast&lt;unsigned short&gt;(val))
         : static_cast&lt;long&gt;(val)). failed();
</pre>

<p>
When val is of type int the formatting conversion occurs as if it performed
the following code fragment:
</p>

<pre>
ios_base::fmtflags baseflags = ios_base::flags() &amp; ios_base::basefield;
bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
   &gt;(getloc()).put(*this, *this, fill(),
      baseflags == ios_base::oct || baseflags == ios_base::hex
         ? static_cast&lt;long&gt;(static_cast&lt;unsigned int&gt;(val))
         : static_cast&lt;long&gt;(val)). failed();
</pre>

<p>
When val is of type unsigned short or unsigned int the formatting conversion
occurs as if it performed the following code fragment:
</p>

<pre>
bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
   &gt;(getloc()).put(*this, *this, fill(), static_cast&lt;unsigned long&gt;(val)).
failed();
</pre>

<p>
When val is of type float the formatting conversion occurs as if it
performed the following code fragment:
</p>

<pre>
bool failed = use_facet&lt;
   num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
   &gt;(getloc()).put(*this, *this, fill(), static_cast&lt;double&gt;(val)).
failed();
</pre>

</blockquote>

<p>
            <i>[post-Toronto: This differs from the previous proposed
resolution; PJP provided the new wording.  The differences are in
signed short and int output.]</i>
        </p>
<p>
            <b>Rationale:</b>
        </p>
<p>The original proposed resolution was to cast int and short to long,
unsigned int and unsigned short to unsigned long, and float to double,
thus ensuring that we don't try to use nonexistent num_put&lt;&gt;
member functions.  The current proposed resolution is more
complicated, but gives more expected results for hex and octal output
of signed short and signed int.  (On a system with 16-bit short, for
example, printing short(-1) in hex format should yield 0xffff.)</p>
<hr>
        <a name="118">
            <h3>118.&nbsp;<tt>basic_istream</tt> uses nonexistent <tt>num_get</tt> member functions</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.1.2.2 <a href="lib-iostreams.html#lib.istream.formatted.arithmetic">[lib.istream.formatted.arithmetic]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;20 Nov 1998</p>
<p>Formatted input is defined for the types <tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>,
<tt>unsigned int</tt>, <tt>long</tt>, <tt>unsigned long</tt>, <tt>float</tt>, <tt>double</tt>,
<tt>long double</tt>, <tt>bool</tt>, and <tt>void*</tt>. According to section 27.6.1.2.2,
formatted input of a value <tt>x</tt> is done as if by the following code fragment: </p>

<pre>typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget; 
iostate err = 0; 
use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, val); 
setstate(err);</pre>

<p>According to section 22.2.2.1.1 <a href="lib-locales.html#lib.facet.num.get.members">[lib.facet.num.get.members]</a>, however,
<tt>num_get&lt;&gt;::get()</tt> is only overloaded for the types
<tt>bool</tt>, <tt>long</tt>, <tt>unsigned short</tt>, <tt>unsigned
int</tt>, <tt>unsigned long</tt>, <tt>unsigned long</tt>,
<tt>float</tt>, <tt>double</tt>, <tt>long double</tt>, and
<tt>void*</tt>. Comparing the lists from the two sections, we find
that 27.6.1.2.2 is using a nonexistent function for types
<tt>short</tt> and <tt>int</tt>. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 27.6.1.2.2 <a href="lib-iostreams.html#lib.istream.formatted.arithmetic">[lib.istream.formatted.arithmetic]</a> Arithmetic Extractors, remove the
two lines (1st and 3rd) which read:</p>
<blockquote>
  <pre>operator&gt;&gt;(short&amp; val);
...
operator&gt;&gt;(int&amp; val);</pre>
</blockquote>

<p>And add the following at the end of that section (27.6.1.2.2) :</p>

<blockquote>
  <pre>operator&gt;&gt;(short&amp; val);</pre>
  <p>The conversion occurs as if performed by the following code fragment (using
  the same notation as for the preceding code fragment):</p>
  <pre>  typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
  iostate err = 0;
  long lval;
  use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, lval);
        if (err == 0
                &amp;&amp; (lval &lt; numeric_limits&lt;short&gt;::min() || numeric_limits&lt;short&gt;::max() &lt; lval))
                err = ios_base::failbit;
  setstate(err);</pre>
  <pre>operator&gt;&gt;(int&amp; val);</pre>
  <p>The conversion occurs as if performed by the following code fragment (using
  the same notation as for the preceding code fragment):</p>
  <pre>  typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
  iostate err = 0;
  long lval;
  use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, lval);
        if (err == 0
                &amp;&amp; (lval &lt; numeric_limits&lt;int&gt;::min() || numeric_limits&lt;int&gt;::max() &lt; lval))
                err = ios_base::failbit;
  setstate(err);</pre>
</blockquote>

<p>
            <i>[Post-Tokyo: PJP provided the above wording.]</i>
        </p>
<hr>
        <a name="120">
            <h3>120.&nbsp;Can an implementor add specializations?</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.3.1 <a href="lib-intro.html#lib.reserved.names">[lib.reserved.names]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;15 Dec 1998</p>
<p>Section 17.4.3.1 says: </p>

<blockquote>
  <p>It is undefined for a C++ program to add declarations or definitions to namespace std
  or namespaces within namespace std unless otherwise specified. A program may add template
  specializations for any standard library template to namespace std. Such a specialization
  (complete or partial) of a standard library template results in undefined behavior unless
  the declaration depends on a user-defined name of external linkage and unless the
  specialization meets the standard library requirements for the original template... </p>
</blockquote>

<p>This implies that it is ok for library users to add specializations, but not
implementors. A user program can actually detect this, for example, the following manual
instantiation will not compile if the implementor has made ctype&lt;wchar_t&gt; a
specialization: </p>

<pre>
#include &lt;locale&gt;
#include &lt;wchar.h&gt;

template class std::ctype&lt;wchar_t&gt;; // can't be specialization
</pre>

<p>
Lib-7047 Matt Austern comments:
</p>
<p>The status quo is unclear, and probably contradictory. This issue
applies both to explicit instantiations and to specializations, since
it is not permitted to provide both a specialization and an explicit
instantiation.
</p>
<p>
The specialization issue is actually more serious than the
instantiation one.  One could argue that there is a consistent status
quo as far as instantiations go, but one can't argue that in the case
of specializations. The standard must either (1) give library
implementors license to provide explicit specializations of any
library template; or (2) give a complete list of exactly which
specializations must be provided, and forbid library implementors from
providing any specializations not on that list. At present the
standard does neither.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Append to 17.4.3.1 <a href="lib-intro.html#lib.reserved.names">[lib.reserved.names]</a> paragraph 1: </p>

<blockquote>

<p>A program may manually instantiate any templates in the standard
library only if the declaration depends on a user-defined name of
external linkage and the instantiation meets the standard library
requirements for the original template. </p>

</blockquote>

<p>
            <i>[Post-Tokyo: Judy Ward provided the above wording.]</i>
        </p>

<p>
            <i>[Toronto: The LWG is concerned about the scope of this proposed
resolution: manually instantiating standard library templates is a
common method for reducing compilation times.  One possible
alternative is a core change: allow (and ignore) manual instantiation
requests when there is an explicit specialization.  Another possible
alternative is requiring that library implementors provide a list of
specializations and explicit instantiations as part of their
documentation.  Judy has volunteered to provide wording for the latter
alternative.]</i>
        </p>
<hr>
        <a name="123">
            <h3>123.&nbsp;Should valarray helper arrays fill functions be const?</h3>
        </a>
        <p>
            <b>Section:</b> 26.3.5.4 <a href="lib-numerics.html#lib.slice.arr.fill">[lib.slice.arr.fill]</a>, 26.3.7.4 <a href="lib-numerics.html#lib.gslice.array.fill">[lib.gslice.array.fill]</a>, 26.3.8.4 <a href="lib-numerics.html#lib.mask.array.fill">[lib.mask.array.fill]</a>, 26.3.9.4 <a href="lib-numerics.html#lib.indirect.array.fill">[lib.indirect.array.fill]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;15 Dec 1998 </p>
<p>One of the operator= in the valarray helper arrays is const and one
is not. For example, look at slice_array. This operator= in Section
26.3.5.2 <a href="lib-numerics.html#lib.slice.arr.assign">[lib.slice.arr.assign]</a> is const: </p>

<p>&nbsp;&nbsp;&nbsp; <tt>void operator=(const valarray&lt;T&gt;&amp;) const;</tt> </p>

<p>but this one in Section 26.3.5.4 <a href="lib-numerics.html#lib.slice.arr.fill">[lib.slice.arr.fill]</a> is not: </p>

<p>&nbsp;&nbsp;&nbsp; <tt>void operator=(const T&amp;); </tt>
        </p>

<p>The description of the semantics for these two functions is similar. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Make the <tt>operator=(const T&amp;)</tt> versions of slice_array, gslice_array,
indirect_array, and mask_array <tt>const</tt> member functions. </p>

<p>
            <i>[Dublin: Pete Becker spoke to Daveed Vandevoorde about this and will work on a
proposed resolution.]</i>
        </p>

<p>
            <i>[Tokyo: Discussed together with the AFNOR paper
00-0023/N1246. The current helper slices now violate language rules
due to a core language change (but most compilers don't check, so the
violation has previously gone undetected). Major surgery is being
asked for in this and other valarray proposals (see issue <a href="lwg-closed.html#77">77</a>Rationale), and a complete design review is needed before
making piecemeal changes. Robert Klarer will work on formulating the
issues.]</i>
        </p>
<hr>
        <a name="136">
            <h3>136.&nbsp;seekp, seekg setting wrong streams?</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.1.3 <a href="lib-iostreams.html#lib.istream.unformatted">[lib.istream.unformatted]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Howard Hinnant <b>Date:</b>&nbsp;6 Mar 1999</p>
<p>I may be misunderstanding the intent, but should not seekg set only
the input stream and seekp set only the output stream? The description
seems to say that each should set both input and output streams. If
that's really the intent, I withdraw this proposal.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In section 27.6.1.3 change:</p>

<pre>basic_istream&lt;charT,traits&gt;&amp; seekg(pos_type pos);
Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos). </pre>

<p>To:</p>

<pre>basic_istream&lt;charT,traits&gt;&amp; seekg(pos_type pos);
Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos, ios_base::in). </pre>

<p>In section 27.6.1.3 change:</p>

<pre>basic_istream&lt;charT,traits&gt;&amp; seekg(off_type&amp; off, ios_base::seekdir dir);
Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir). </pre>

<p>To:</p>

<pre>basic_istream&lt;charT,traits&gt;&amp; seekg(off_type&amp; off, ios_base::seekdir dir);
Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir, ios_base::in). </pre>

<p>In section 27.6.2.4, paragraph 2 change:</p>

<pre>-2- Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos). </pre>

<p>To:</p>

<pre>-2- Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos, ios_base::out). </pre>

<p>In section 27.6.2.4, paragraph 4 change:</p>

<pre>-4- Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir). </pre>

<p>To:</p>

<pre>-4- Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir, ios_base::out). </pre>

<p>
            <i>[Dublin: Dietmar K&uuml;hl thinks this is probably correct, but would
like the opinion of more iostream experts before taking action.]</i>
        </p>

<p>
            <i>[Tokyo: Reviewed by the LWG. PJP noted that although his docs are
incorrect, his implementation already implements the Proposed
Resolution.]</i>
        </p>

<p>
            <i>[Post-Tokyo: Matt Austern comments:<br>
Is it a problem with basic_istream and basic_ostream, or is it a problem
with basic_stringbuf?
We could resolve the issue either by changing basic_istream and
basic_ostream, or by changing basic_stringbuf. I prefer the latter
change (or maybe both changes): I don't see any reason for the standard to
require that std::stringbuf s(std::string("foo"), std::ios_base::in);
s.pubseekoff(0, std::ios_base::beg); must fail.<br>
This requirement is a bit weird. There's no similar requirement
for basic_streambuf&lt;&gt;::seekpos, or for basic_filebuf&lt;&gt;::seekoff or
basic_filebuf&lt;&gt;::seekpos.]</i>
        </p>
<hr>
        <a name="153">
            <h3>153.&nbsp;Typo in <tt>narrow()</tt> semantics</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.1.3.2 <a href="lib-locales.html#lib.facet.ctype.char.members">[lib.facet.ctype.char.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;20 Jul 1999</p>
<p>The description of the array version of <tt>narrow()</tt> (in
paragraph 11) is flawed: There is no member <tt>do_narrow()</tt> which
takes only three arguments because in addition to the range a default
character is needed.</p>

<p>Additionally, for both <tt>widen</tt> and <tt>narrow</tt> we have
two signatures followed by a <b>Returns</b> clause that only addresses
one of them.</p>

<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the returns clause in 22.2.1.3.2 <a href="lib-locales.html#lib.facet.ctype.char.members">[lib.facet.ctype.char.members]</a>
paragraph 10 from:</p>
<p>&nbsp;&nbsp;&nbsp; Returns: do_widen(low, high, to).</p>

<p>to:</p>
<p>&nbsp;&nbsp;&nbsp; Returns: do_widen(c) or do_widen(low, high, to), 
respectively.</p>

<p>Change 22.2.1.3.2 <a href="lib-locales.html#lib.facet.ctype.char.members">[lib.facet.ctype.char.members]</a> paragraph 10 and 11 from:</p>
<pre>        char        narrow(char c, char /*dfault*/) const;
        const char* narrow(const char* low, const char* high,
                           char /*dfault*/, char* to) const;</pre>
<pre>        Returns: do_narrow(low, high, to).</pre>
<p>to:</p>
<pre>        char        narrow(char c, char dfault) const;
        const char* narrow(const char* low, const char* high,
                           char dfault, char* to) const;</pre>
<pre>        Returns: do_narrow(c, dfault) or
                 do_narrow(low, high, dfault, to), respectively.</pre>

<p>
            <i>[Kona: 1) the problem occurs in additional places, 2) a user
defined version could be different.]</i>
        </p>

<p>
            <i>[Post-Tokyo: Dietmar provided the above wording at the request of
the LWG. He could find no other places the problem occurred. He
asks for clarification of the Kona "a user defined
version..." comment above.  Perhaps it was a circuitous way of
saying "dfault" needed to be uncommented?]</i>
        </p>

<p>
            <i>[Post-Toronto: the issues list maintainer has merged in the
proposed resolution from issue <a href="lwg-closed.html#207">207</a>, which addresses the
same paragraphs.]</i>
        </p>
<hr>
        <a name="165">
            <h3>165.&nbsp;<tt>xsputn()</tt>, <tt>pubsync()</tt> never called by <tt>basic_ostream</tt> members?</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.2.1 <a href="lib-iostreams.html#lib.ostream">[lib.ostream]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;20 Jul 1999</p>
<p>Paragraph 2 explicitly states that none of the <tt>basic_ostream</tt>
functions falling into one of the groups "formatted output functions"
and "unformatted output functions" calls any stream buffer function
which might call a virtual function other than <tt>overflow()</tt>. Basically
this is fine but this implies that <tt>sputn()</tt> (this function would call
the virtual function <tt>xsputn()</tt>) is never called by any of the standard
output functions. Is this really intended? At minimum it would be convenient to
call <tt>xsputn()</tt> for strings... Also, the statement that <tt>overflow()</tt>
is the only virtual member of <tt>basic_streambuf</tt> called is in conflict
with the definition of <tt>flush()</tt> which calls <tt>rdbuf()-&gt;pubsync()</tt>
and thereby the virtual function <tt>sync()</tt> (<tt>flush()</tt> is listed
under "unformatted output functions").</p>
<p>In addition, I guess that the sentence starting with "They may use other
public members of <tt>basic_ostream</tt> ..." probably was intended to
start with "They may use other public members of <tt>basic_streamuf</tt>..."
although the problem with the virtual members exists in both cases.</p>
<p>I see two obvious resolutions:</p>
<ol>
  <li>state in a footnote that this means that <tt>xsputn()</tt> will never be
    called by any ostream member and that this is intended.</li>
  <li>relax the restriction and allow calling <tt>overflow()</tt> and <tt>xsputn()</tt>.
    Of course, the problem with <tt>flush()</tt> has to be resolved in some way.</li>
</ol>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the last sentence of 27.6.2.1 (lib.ostream) paragraph 2 from:</p>
<blockquote>
  <p>They may use other public members of basic_ostream except that they do not
  invoke any virtual members of rdbuf() except overflow().</p>
</blockquote>
<p>to:</p>
<blockquote>
  <p>They may use other public members of basic_ostream except that they shall
  not invoke any virtual members of rdbuf() except overflow(), xsputn(), and
  sync().</p>
</blockquote>

<p>
            <i>[Kona: the LWG believes this is a problem. Wish to ask Jerry or
PJP why the standard is written this way.]</i>
        </p>

<p>
            <i>[Post-Tokyo: Dietmar supplied wording at the request of the
LWG. He comments: The rules can be made a little bit more specific if
necessary be explicitly spelling out what virtuals are allowed to be
called from what functions and eg to state specifically that flush()
is allowed to call sync() while other functions are not.]</i>
        </p>
<hr>
        <a name="167">
            <h3>167.&nbsp;Improper use of <tt>traits_type::length()</tt>
            </h3>
        </a>
        <p>
            <b>Section:</b> 27.6.2.5.4 <a href="lib-iostreams.html#lib.ostream.inserters.character">[lib.ostream.inserters.character]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;20 Jul 1999</p>
<p>Paragraph 4 states that the length is determined using
<tt>traits::length(s)</tt>.  Unfortunately, this function is not
defined for example if the character type is <tt>wchar_t</tt> and the
type of <tt>s</tt> is <tt>char const*</tt>. Similar problems exist if
the character type is <tt>char</tt> and the type of <tt>s</tt> is
either <tt>signed char const*</tt> or <tt>unsigned char
const*</tt>.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 27.6.2.5.4 <a href="lib-iostreams.html#lib.ostream.inserters.character">[lib.ostream.inserters.character]</a> paragraph 4 from:</p>
<blockquote>
  <p>Effects: Behaves like an formatted inserter (as described in
  lib.ostream.formatted.reqmts) of out. After a sentry object is
  constructed it inserts characters. The number of characters starting
  at s to be inserted is traits::length(s). Padding is determined as
  described in lib.facet.num.put.virtuals. The traits::length(s)
  characters starting at s are widened using out.widen
  (lib.basic.ios.members). The widened characters and any required
  padding are inserted into out. Calls width(0).</p>
</blockquote>
<p>to:</p>
<blockquote>
  <p>Effects: Behaves like an formatted inserter (as described in
  lib.ostream.formatted.reqmts) of out. After a sentry object is
  constructed it inserts characters. The number len of characters
  starting at s to be inserted is</p>
  <p>
  - traits::length((const char*)s) if the second argument is of type 
    const charT*<br>
  - char_traits&lt;char&gt;::length(s) if the second argument is of
    type const char*, const signed char*, or const unsigned char* and
    and charT is not char.<br>
  </p>
  <p>Padding is determined as described in
  lib.facet.num.put.virtuals. The len characters starting at s are
  widened using out.widen (lib.basic.ios.members).  The widened
  characters and any required padding are inserted into out. Calls
  width(0).</p>
</blockquote>

<p>
            <i>[Kona: It is clear to the LWG there is a defect here.
Dietmar will supply specific wording.]</i>
        </p> 

<p>
            <i>[Post-Tokyo: Dietmar supplied the above wording.]</i>
        </p>

<p>
            <i>[Toronto: The original proposed resolution involved 
char_traits&lt;signed char&gt; and char_traits&lt;unsigned char&gt;.  
There was strong opposition to requiring that library implementors
provide those specializations of char_traits.]</i>
        </p>
<hr>
        <a name="171">
            <h3>171.&nbsp;Strange <tt>seekpos()</tt> semantics due to joint position</h3>
        </a>
        <p>
            <b>Section:</b> 27.8.1.4 <a href="lib-iostreams.html#lib.filebuf.virtuals">[lib.filebuf.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;20 Jul 1999</p>
<p>Overridden virtual functions, seekpos()</p> <p>In 27.8.1.1 <a href="lib-iostreams.html#lib.filebuf">[lib.filebuf]</a> paragraph 3, it is stated that a joint input and
output position is maintained by <tt>basic_filebuf</tt>. Still, the
description of <tt>seekpos()</tt> seems to talk about different file
positions. In particular, it is unclear (at least to me) what is
supposed to happen to the output buffer (if there is one) if only the
input position is changed. The standard seems to mandate that the
output buffer is kept and processed as if there was no positioning of
the output position (by changing the input position). Of course, this
can be exactly what you want if the flag <tt>ios_base::ate</tt> is
set. However, I think, the standard should say something like
this:</p>
<ul>
  <li>If <tt>(which &amp; mode) == 0</tt> neither read nor write position is
    changed and the call fails. Otherwise, the joint read and write position is
    altered to correspond to <tt>sp</tt>.</li>
  <li>If there is an output buffer, the output sequences is updated and any
    unshift sequence is written before the position is altered.</li>
  <li>If there is an input buffer, the input sequence is updated after the
    position is altered.</li>
</ul>
<p>Plus the appropriate error handling, that is...</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the unnumbered paragraph in 27.8.1.4 (lib.filebuf.virtuals) before
paragraph 14 from:</p>
<blockquote>
  <p>pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in |
  ios_base::out);</p>
  <p>Alters the file position, if possible, to correspond to the position stored
  in sp (as described below).</p>
  <p>- if (which&amp;ios_base::in)!=0, set the file position to sp, then update
  the input sequence</p>
  <p>- if (which&amp;ios_base::out)!=0, then update the output sequence, write
  any unshift sequence, and set the file position to sp.</p>
</blockquote>
<p>to:</p>
<blockquote>
  <p>pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in |
  ios_base::out);</p>
  <p>Alters the file position, if possible, to correspond to the position stored
  in sp (as described below). Altering the file position performs as follows:</p>
  <p>1. if (om &amp; ios_base::out)!=0, then update the output sequence and
  write any unshift sequence;</p>
  <p>2. set the file position to sp;</p>
  <p>3. if (om &amp; ios_base::in)!=0, then update the input sequence;</p>
  <p>where om is the open mode passed to the last call to open(). The operation
  fails if is_open() returns false.</p>
</blockquote>

<p>
            <i>[Kona: Dietmar is working on a proposed resolution.]</i>
        </p>
<p>
            <i>[Post-Tokyo: Dietmar supplied the above wording.]</i>
        </p>
<hr>
        <a name="179">
            <h3>179.&nbsp;Comparison of const_iterators to iterators doesn't work</h3>
        </a>
        <p>
            <b>Section:</b> 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;2 Jul 1998</p>
<p>Currently the following will not compile on two well-known standard
library implementations:</p>

<blockquote>
  <pre>#include &lt;set&gt;
using namespace std;

void f(const set&lt;int&gt; &amp;s)
{
  set&lt;int&gt;::iterator i;
  if (i==s.end()); // s.end() returns a const_iterator
}</pre>
</blockquote>

<p>
The reason this doesn't compile is because operator== was implemented
as a member function of the nested classes set:iterator and
set::const_iterator, and there is no conversion from const_iterator to
iterator. Surprisingly, (s.end() == i) does work, though, because of
the conversion from iterator to const_iterator.
</p>

<p>
I don't see a requirement anywhere in the standard that this must
work. Should there be one?  If so, I think the requirement would need
to be added to the tables in section 24.1.1. I'm not sure about the
wording.  If this requirement existed in the standard, I would think
that implementors would have to make the comparison operators
non-member functions.</p>

<p>This issues was also raised on comp.std.c++ by Darin
Adler.&nbsp; The example given was:</p>

<blockquote>
  <pre>bool check_equal(std::deque&lt;int&gt;::iterator i,
std::deque&lt;int&gt;::const_iterator ci)
{
return i == ci;
}</pre>
</blockquote>

<p>Comment from John Potter:</p>
<blockquote>
    <p>
    In case nobody has noticed, accepting it will break reverse_iterator.
    </p>

    <p>
    The fix is to make the comparison operators templated on two types.
    </p>

    <pre>
    template &lt;class Iterator1, class Iterator2&gt;
    bool operator== (reverse_iterator&lt;Iterator1&gt; const&amp; x,
                     reverse_iterator&lt;Iterator2&gt; const&amp; y);
    </pre>

    <p>
    Obviously:  return x.base() == y.base();
    </p>

    <p>
    Currently, no reverse_iterator to const_reverse_iterator compares are
    valid.
    </p>

    <p>
    BTW, I think the issue is in support of bad code.  Compares should be
    between two iterators of the same type.  All std::algorithms require
    the begin and end iterators to be of the same type. 
    </p>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In section 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a> after paragraph 7 add:</p>
<blockquote>
  <p>It is possible to mix <tt>iterator</tt>s and 
  <tt>const_iterator</tt>s in iterator comparison and 
  iterator difference operations.</p>
</blockquote>

<p>
            <i>[Post-Tokyo: Judy supplied the above wording at the request of
the LWG.]</i>
        </p>

<p>
            <i>[post-Toronto: Judy supplied a new proposed resolution.  The old
version did not include the words "and iterator
difference".]</i>
        </p>
<p>
            <b>Rationale:</b>
        </p>
<p>
The LWG believes it is clear that the above wording applies only to
the nested types <tt>X::iterator</tt> and <tt>X::const_iterator</tt>,
where <tt>X</tt> is a container.  There is no requirement that
<tt>X::reverse_iterator</tt> and <tt>X::const_reverse_iterator</tt>
can be mixed.  If mixing them is considered important, that's a
separate issue.  (Issue <a href="lwg-active.html#280">280</a>.)
</p>
<hr>
        <a name="182">
            <h3>182.&nbsp;Ambiguous references to size_t</h3>
        </a>
        <p>
            <b>Section:</b> 17 <a href="lib-intro.html#lib.library">[lib.library]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Al Stevens <b>Date:</b>&nbsp;15 Aug 1999</p>
<p>Many references to <tt> size_t</tt> throughout the document
omit the <tt> std::</tt> namespace qualification.</p> <p>For
example, 17.4.3.4 <a href="lib-intro.html#lib.replacement.functions">[lib.replacement.functions]</a> paragraph 2:</p>
<blockquote>
<pre> operator new(size_t)
 operator new(size_t, const std::nothrow_t&amp;)
 operator new[](size_t)
 operator new[](size_t, const std::nothrow_t&amp;)</pre>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>   In 17.4.3.4 <a href="lib-intro.html#lib.replacement.functions">[lib.replacement.functions]</a> paragraph 2: replace:</p>
<blockquote>
<p>
                <tt>     - operator new(size_t)<br>
     - operator new(size_t, const std::nothrow_t&amp;)<br>
     - operator new[](size_t)<br>
     - operator new[](size_t, const std::nothrow_t&amp;)</tt>
            </p>
</blockquote>
<p>    by:</p>
<blockquote>
<pre>- operator new(std::size_t)
- operator new(std::size_t, const std::nothrow_t&amp;)
- operator new[](std::size_t)
- operator new[](std::size_t, const std::nothrow_t&amp;)</pre>
</blockquote>
<p>In [lib.allocator.requirements] 20.1.5, paragraph 4: replace:</p>
<blockquote>
  <p>The typedef members pointer, const_pointer, size_type, and difference_type
  are required to be T*, T const*, size_t, and ptrdiff_t, respectively.</p>
</blockquote>
<p>&nbsp;by:</p>
<blockquote>
  <p>The typedef members pointer, const_pointer, size_type, and difference_type
  are required to be T*, T const*, std::size_t, and std::ptrdiff_t,
  respectively.</p>
</blockquote>
<p>In [lib.allocator.members] 20.4.1.1, paragraphs 3 and 6: replace:</p>
<blockquote>
  <p>3 Notes: Uses ::operator new(size_t) (18.4.1).</p>
  <p>6 Note: the storage is obtained by calling ::operator new(size_t), but it
  is unspecified when or how often this function is called. The use of hint is
  unspecified, but intended as an aid to locality if an implementation so
  desires.</p>
</blockquote>
<p>by:</p>
<blockquote>
  <p>3 Notes: Uses ::operator new(std::size_t) (18.4.1).</p>
  <p>6 Note: the storage is obtained by calling ::operator new(std::size_t), but
  it is unspecified when or how often this function is called. The use of hint
  is unspecified, but intended as an aid to locality if an implementation so
  desires.</p>
</blockquote>
<p>In [lib.char.traits.require] 21.1.1, paragraph 1: replace:</p>
<blockquote>
  <p>In Table 37, X denotes a Traits class defining types and functions for the
  character container type CharT; c and d denote values of type CharT; p and q
  denote values of type const CharT*; s denotes a value of type CharT*; n, i and
  j denote values of type size_t; e and f denote values of type X::int_type; pos
  denotes a value of type X::pos_type; and state denotes a value of type X::state_type.</p>
</blockquote>
<p>by:</p>
<blockquote>
  <p>In Table 37, X denotes a Traits class defining types and functions for the
  character container type CharT; c and d denote values of type CharT; p and q
  denote values of type const CharT*; s denotes a value of type CharT*; n, i and
  j denote values of type std::size_t; e and f denote values of type X::int_type;
  pos denotes a value of type X::pos_type; and state denotes a value of type X::state_type.</p>
</blockquote>
<p>In [lib.char.traits.require] 21.1.1, table 37: replace the return type of
X::length(p): "size_t" by "std::size_t".</p>
<p>   In [lib.std.iterator.tags] 24.3.3, paragraph 2:    replace:<br>
&nbsp;&nbsp;&nbsp; typedef ptrdiff_t difference_type;<br>
    by:<br>
&nbsp;&nbsp;&nbsp; typedef std::ptrdiff_t difference_type;</p>
<p>   In [lib.locale.ctype] 22.2.1.1 put namespace std { ...} around the declaration of    template &lt;class charT&gt; class ctype.<br>
<br>
   In [lib.iterator.traits] 24.3.1, paragraph 2    put namespace std { ...} around the declaration of:<br>
<br>
&nbsp;&nbsp;&nbsp; template&lt;class Iterator&gt; struct iterator_traits<br>
&nbsp;&nbsp;&nbsp; template&lt;class T&gt; struct iterator_traits&lt;T*&gt;<br>
&nbsp;&nbsp;&nbsp; template&lt;class T&gt; struct iterator_traits&lt;const T*&gt;</p>
<p>
            <b>Rationale:</b>
        </p>
<p>The LWG believes correcting names like <tt>size_t</tt> and
<tt>ptrdiff_t</tt> to <tt>std::size_t</tt> and <tt>std::ptrdiff_t</tt>
to be essentially editorial.  There there can't be another size_t or
ptrdiff_t meant anyway because, according to 17.4.3.1.4 <a href="lib-intro.html#lib.extern.types">[lib.extern.types]</a>,</p>

<blockquote>
For each type T from the Standard C library, the types ::T and std::T
are reserved to the implementation and, when defined, ::T shall be
identical to std::T.
</blockquote>

<p>The issue is treated as a Defect Report to make explicit the Project
Editor's authority to make this change.</p>

<p>
            <i>[Post-Tokyo: Nico Josuttis provided the above wording at the
request of the LWG.]</i>
        </p>

<p>
            <i>[Toronto: This is tangentially related to issue <a href="lwg-active.html#229">229</a>, but only tangentially: the intent of this issue is to
address use of the name <tt>size_t</tt> in contexts outside of
namespace std, such as in the description of <tt>::operator new</tt>.
The proposed changes should be reviewed to make sure they are
correct.]</i>
        </p>

<p>
            <i>[pre-Copenhagen: Nico has reviewed the changes and believes
them to be correct.]</i>
        </p>

<hr>
        <a name="183">
            <h3>183.&nbsp;I/O stream manipulators don't work for wide character streams</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.3 <a href="lib-iostreams.html#lib.std.manip">[lib.std.manip]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andy Sawyer <b>Date:</b>&nbsp;7 Jul 1999</p>
<p>27.6.3 <a href="lib-iostreams.html#lib.std.manip">[lib.std.manip]</a> paragraph 3 says (clause numbering added for
exposition):</p>
<blockquote>
<p>Returns: An object s of unspecified type such that if [1] out is an (instance
of) basic_ostream then the expression out&lt;&lt;s behaves as if f(s) were
called, and if [2] in is an (instance of) basic_istream then the expression
in&gt;&gt;s behaves as if f(s) were called. Where f can be defined as: ios_base&amp;
f(ios_base&amp; str, ios_base::fmtflags mask) { // reset specified flags
str.setf(ios_base::fmtflags(0), mask); return str; } [3] The expression
out&lt;&lt;s has type ostream&amp; and value out. [4] The expression in&gt;&gt;s
has type istream&amp; and value in.</p>
</blockquote>
<p>Given the definitions [1] and [2] for out and in, surely [3] should read:
"The expression out &lt;&lt; s has type basic_ostream&amp; ..." and
[4] should read: "The expression in &gt;&gt; s has type basic_istream&amp;
..."</p>
<p>If the wording in the standard is correct, I can see no way of implementing
any of the manipulators so that they will work with wide character streams.</p>
<p>e.g. wcout &lt;&lt; setbase( 16 );</p>
<p>Must have value 'wcout' (which makes sense) and type 'ostream&amp;' (which
doesn't).</p>
<p>The same "cut'n'paste" type also seems to occur in Paras 4,5,7 and
8. In addition, Para 6 [setfill] has a similar error, but relates only to
ostreams.</p>
<p>I'd be happier if there was a better way of saying this, to make it clear
that the value of the expression is "the same specialization of
basic_ostream as out"&amp;</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace section 27.6.3 <a href="lib-iostreams.html#lib.std.manip">[lib.std.manip]</a> except paragraph 1 with the
following:</p>
<blockquote>
<p>2- The type designated smanip in each of the following function descriptions is implementation-specified and may be different for each
function.<br>
<br>
<tt>smanip resetiosflags(ios_base::fmtflags mask);</tt>
                <br>
<br>
-3- Returns: An object s of unspecified type such that if out is an instance of basic_ostream&lt;charT,traits&gt; then the expression out&lt;&lt;s behaves
as if f(s, mask) were called, or if in is an instance of basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s behaves as if
f(s, mask) were called. The function f can be defined as:*<br>
<br>
[Footnote: The expression cin &gt;&gt; resetiosflags(ios_base::skipws) clears ios_base::skipws in the format flags stored in the
basic_istream&lt;charT,traits&gt; object cin (the same as cin &gt;&gt; noskipws), and the expression cout &lt;&lt; resetiosflags(ios_base::showbase) clears
ios_base::showbase in the format flags stored in the basic_ostream&lt;charT,traits&gt; object cout (the same as cout &lt;&lt;
noshowbase). --- end footnote]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, ios_base::fmtflags mask)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  reset specified flags<br>
&nbsp;&nbsp; str.setf(ios_base::fmtflags(0), mask);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
<br>
&nbsp;<tt>smanip setiosflags(ios_base::fmtflags mask);</tt>
                <br>
<br>
-4- Returns: An object s of unspecified type such that if out is an instance of basic_ostream&lt;charT,traits&gt; then the expression out&lt;&lt;s behaves
as if f(s, mask) were called, or if in is an instance of basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s behaves as if f(s,
mask) were called. The function f can be defined as:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, ios_base::fmtflags mask)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  set specified flags<br>
&nbsp;&nbsp; str.setf(mask);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
<br>
<tt>smanip setbase(int base);</tt>
                <br>
<br>
-5- Returns: An object s of unspecified type such that if out is an instance of basic_ostream&lt;charT,traits&gt; then the expression out&lt;&lt;s behaves
as if f(s, base) were called, or if in is an instance of basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s behaves as if f(s,
base) were called. The function f can be defined as:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int base)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  set  basefield<br>
&nbsp;&nbsp; str.setf(base ==  8 ? ios_base::oct :<br>
&nbsp;&nbsp; base == 10 ? ios_base::dec :<br>
&nbsp;&nbsp; base == 16 ? ios_base::hex :<br>
&nbsp;&nbsp; ios_base::fmtflags(0), ios_base::basefield);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
<br>
<tt>smanip setfill(char_type c);<br>
</tt>
                <br>
-6- Returns: An object s of unspecified type such that if out is (or is derived from) basic_ostream&lt;charT,traits&gt; and c has type charT then the
expression out&lt;&lt;s behaves as if f(s, c) were called. The function f can be
defined as:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>template&lt;class charT, class traits&gt;<br>
&nbsp;&nbsp; basic_ios&lt;charT,traits&gt;&amp; f(basic_ios&lt;charT,traits&gt;&amp; str, charT c)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  set fill character<br>
&nbsp;&nbsp; str.fill(c);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.<br>
<br>
<tt>smanip setprecision(int n);</tt>
                <br>
<br>
-7- Returns: An object s of unspecified type such that if out is an instance of basic_ostream&lt;charT,traits&gt; then the expression out&lt;&lt;s behaves
as if f(s, n) were called, or if in is an instance of basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s behaves as if f(s, n)
were called. The function f can be defined as:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int n)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  set precision<br>
&nbsp;&nbsp; str.precision(n);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in<br>
.<br>
<tt>smanip setw(int n);<br>
</tt>
                <br>
-8- Returns: An object s of unspecified type such that if out is an instance of basic_ostream&lt;charT,traits&gt; then the expression out&lt;&lt;s behaves
as if f(s, n) were called, or if in is an instance of basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s behaves as if f(s, n)
were called. The function f can be defined as:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int n)<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; //  set width<br>
&nbsp;&nbsp; str.width(n);<br>
&nbsp;&nbsp; return str;<br>
&nbsp;&nbsp; }<br>
</tt>
                <br>
The expression out&lt;&lt;s has type
basic_ostream&lt;charT,traits&gt;&amp; and value out.  The expression
in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value
in.
</p>
</blockquote>

<p>
            <i>[Kona: Andy Sawyer and Beman Dawes will work to improve the wording of
the proposed resolution.]</i>
        </p>

<p>
            <i>[Tokyo - The LWG noted that issue <a href="lwg-closed.html#216">216</a> involves
the same paragraphs.]</i>
        </p>

<p>
            <i>[Post-Tokyo: The issues list maintainer combined the proposed
resolution of this issue with the proposed resolution for issue <a href="lwg-closed.html#216">216</a> as they both involved the same paragraphs, and were so
intertwined that dealing with them separately appear fraught with
error.  The full text was supplied by Bill Plauger; it was cross
checked against changes supplied by Andy Sawyer. It should be further
checked by the LWG.]</i>
        </p>
<hr>
        <a name="184">
            <h3>184.&nbsp;numeric_limits&lt;bool&gt; wording problems</h3>
        </a>
        <p>
            <b>Section:</b> 18.2.1.5 <a href="lib-support.html#lib.numeric.special">[lib.numeric.special]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Gabriel Dos Reis <b>Date:</b>&nbsp;21 Jul 1999</p>
<p>bools are defined by the standard to be of integer types, as per
3.9.1 <a href="basic.html#basic.fundamental">[basic.fundamental]</a> paragraph 7.  However "integer types"
seems to have a special meaning for the author of 18.2. The net effect
is an unclear and confusing specification for
numeric_limits&lt;bool&gt; as evidenced below.</p>

<p>18.2.1.2/7 says numeric_limits&lt;&gt;::digits is, for built-in integer
types, the number of non-sign bits in the representation.</p>

<p>4.5/4 states that a bool promotes to int ; whereas 4.12/1 says any non zero
arithmetical value converts to true.</p>

<p>I don't think it makes sense at all to require
numeric_limits&lt;bool&gt;::digits and numeric_limits&lt;bool&gt;::digits10 to
be meaningful.</p>

<p>The standard defines what constitutes a signed (resp. unsigned) integer
types. It doesn't categorize bool as being signed or unsigned. And the set of
values of bool type has only two elements.</p>

<p>I don't think it makes sense to require numeric_limits&lt;bool&gt;::is_signed
to be meaningful.</p>

<p>18.2.1.2/18 for numeric_limits&lt;integer_type&gt;::radix&nbsp; says:</p>
<blockquote>
  <p>For integer types, specifies the base of the representation.186)</p>
</blockquote>

<p>This disposition is at best misleading and confusing for the standard
requires a "pure binary numeration system" for integer types as per
3.9.1/7</p>

<p>The footnote 186) says: "Distinguishes types with base other than 2 (e.g
BCD)."&nbsp; This also erroneous as the standard never defines any integer
types with base representation other than 2.</p>

<p>Furthermore, numeric_limits&lt;bool&gt;::is_modulo and
numeric_limits&lt;bool&gt;::is_signed have similar problems.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Append to the end of 18.2.1.5 <a href="lib-support.html#lib.numeric.special">[lib.numeric.special]</a>:</p>
<blockquote>
  <p>The specialization for bool shall be provided as follows:</p>
  <pre>    namespace std {
       template&lt;&gt; class numeric_limits&lt;bool&gt; {
       public:
         static const bool is_specialized = true;
         static bool min() throw() { return false; }
         static bool max() throw() { return true; }

         static const int  digits = 1;
         static const int  digits10 = 0;
         static const bool is_signed = false;
         static const bool is_integer = true;
         static const bool is_exact = true;
         static const int  radix = 2;
         static bool epsilon() throw() { return 0; }
         static bool round_error() throw() { return 0; }

         static const int  min_exponent = 0;
         static const int  min_exponent10 = 0;
         static const int  max_exponent = 0;
         static const int  max_exponent10 = 0;

         static const bool has_infinity = false;
         static const bool has_quiet_NaN = false;
         static const bool has_signaling_NaN = false;
         static const float_denorm_style has_denorm = denorm_absent;
         static const bool has_denorm_loss = false;
         static bool infinity() throw() { return 0; }
         static bool quiet_NaN() throw() { return 0; }
         static bool signaling_NaN() throw() { return 0; }
         static bool denorm_min() throw() { return 0; }

         static const bool is_iec559 = false;
         static const bool is_bounded = true;
         static const bool is_modulo = false;

         static const bool traps = false;
         static const bool tinyness_before = false;
         static const float_round_style round_style = round_toward_zero;
       };
     }</pre>
</blockquote>

<p>
            <i>[Tokyo:&nbsp; The LWG desires wording that specifies exact values
rather than more general wording in the original proposed
resolution.]</i>
        </p>

<p>
            <i>[Post-Tokyo:&nbsp; At the request of the LWG in Tokyo, Nico
Josuttis provided the above wording.]</i>
        </p>
<hr>
        <a name="185">
            <h3>185.&nbsp;Questionable use of term "inline"</h3>
        </a>
        <p>
            <b>Section:</b> 20.3 <a href="lib-utilities.html#lib.function.objects">[lib.function.objects]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;UK Panel <b>Date:</b>&nbsp;26 Jul 1999</p>
<p>Paragraph 4 of 20.3 <a href="lib-utilities.html#lib.function.objects">[lib.function.objects]</a> says:</p>
<blockquote>
  <p>&nbsp;[Example: To negate every element of a: transform(a.begin(), a.end(),
  a.begin(), negate&lt;double&gt;()); The corresponding functions will inline
  the addition and the negation. end example]</p>
</blockquote>
<p>(Note: The "addition" referred to in the above is in para 3) we can
find no other wording, except this (non-normative) example which suggests that
any "inlining" will take place in this case.</p>
<p>Indeed both:</p>
<blockquote>
  <p>17.4.4.3 Global Functions [lib.global.functions] 1 It is
  unspecified whether any global functions in the C++ Standard Library
  are defined as inline (7.1.2).</p>
</blockquote>
<p>and</p>
<blockquote>
  <p>17.4.4.4 Member Functions [lib.member.functions] 1 It is
  unspecified whether any member functions in the C++ Standard Library
  are defined as inline (7.1.2).</p>
</blockquote>
<p>take care to state that this may indeed NOT be the case.</p>
<p>Thus the example "mandates" behavior that is explicitly
not required elsewhere.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 20.3 <a href="lib-utilities.html#lib.function.objects">[lib.function.objects]</a> paragraph 1, remove the sentence:</p>
<blockquote>
<p>They are important for the effective use of the library.</p>
</blockquote>
<p>Remove 20.3 <a href="lib-utilities.html#lib.function.objects">[lib.function.objects]</a> paragraph 2, which reads:</p>
<blockquote>
  <p> Using function objects together with function templates
  increases the expressive power of the library as well as making the
  resulting code much more efficient.</p>
</blockquote>
<p>In 20.3 <a href="lib-utilities.html#lib.function.objects">[lib.function.objects]</a> paragraph 4, remove the sentence:</p>
<blockquote>
  <p>The corresponding functions will inline the addition and the
  negation.</p>
</blockquote>

<p>
            <i>[Kona: The LWG agreed there was a defect.]</i>
        </p>
<p>
            <i>[Tokyo: The LWG crafted the proposed resolution.]</i>
        </p>
<hr>
        <a name="186">
            <h3>186.&nbsp;bitset::set() second parameter should be bool</h3>
        </a>
        <p>
            <b>Section:</b> 23.3.5.2 <a href="lib-containers.html#lib.bitset.members">[lib.bitset.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Darin Adler <b>Date:</b>&nbsp;13 Aug 1999</p>
<p>In section 23.3.5.2 <a href="lib-containers.html#lib.bitset.members">[lib.bitset.members]</a>, paragraph 13 defines the
bitset::set operation to take a second parameter of type int. The
function tests whether this value is non-zero to determine whether to
set the bit to true or false. The type of this second parameter should
be bool. For one thing, the intent is to specify a Boolean value. For
another, the result type from test() is bool. In addition, it's
possible to slice an integer that's larger than an int. This can't
happen with bool, since conversion to bool has the semantic of
translating 0 to false and any non-zero value to true.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 23.3.5 <a href="lib-containers.html#lib.template.bitset">[lib.template.bitset]</a> Para 1 Replace:</p>
<blockquote>
<pre>bitset&lt;N&gt;&amp; set(size_t pos, int val = true ); </pre>
</blockquote>
<p>With:</p>
<blockquote>
  <pre>bitset&lt;N&gt;&amp; set(size_t pos, bool val = true );</pre>
</blockquote>
<p>In 23.3.5.2 <a href="lib-containers.html#lib.bitset.members">[lib.bitset.members]</a> Para 12(.5) Replace:</p>
<blockquote>
  <pre>bitset&lt;N&gt;&amp; set(size_t pos, int val = 1 );</pre>
</blockquote>
<p>With:</p>
<blockquote>
  <pre>bitset&lt;N&gt;&amp; set(size_t pos, bool val = true );</pre>
</blockquote>

<p>
            <i>[Kona: The LWG agrees with the description.&nbsp; Andy Sawyers will work
on better P/R wording.]</i>
        </p>
<p>
            <i>[Post-Tokyo: Andy provided the above wording.]</i>
        </p>
<hr>
        <a name="187">
            <h3>187.&nbsp;iter_swap underspecified</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.2 <a href="lib-algorithms.html#lib.alg.swap">[lib.alg.swap]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andrew Koenig <b>Date:</b>&nbsp;14 Aug 1999</p>
<p>The description of iter_swap in 25.2.2 paragraph 7,says that it ``exchanges the values''
of the objects to which two iterators refer.<br>
<br>
What it doesn't say is whether it does so using swap or using the assignment operator and copy constructor.<br>
<br>
This question is an important one to answer, because swap is specialized to work efficiently for standard containers.<br>
For example:</p>
<blockquote>
<pre>vector&lt;int&gt; v1, v2;
iter_swap(&amp;v1, &amp;v2);</pre>
</blockquote>
<p>Is this call to iter_swap equivalent to calling swap(v1, v2)?&nbsp; Or is it equivalent to</p>
<blockquote>
<pre>{
vector&lt;int&gt; temp = v1;
v1 = v2;
v2 = temp;
}</pre>
</blockquote>
<p>The first alternative is O(1); the second is O(n).</p>
<p>A LWG member, Dave Abrahams, comments:</p>
<blockquote>
<p>Not an objection necessarily, but I want to point out the cost of that requirement:</p>
  <blockquote>
<p>
                    <tt>iter_swap(list&lt;T&gt;::iterator, list&lt;T&gt;::iterator)</tt>
                </p>
  </blockquote>
<p>can currently be specialized to be more efficient than iter_swap(T*,T*) for many T (by using splicing). Your proposal would make that optimization
illegal.&nbsp;</p>
</blockquote>

<p>
            <i>[Kona: The LWG notes the original need for iter_swap was proxy iterators
which are no longer permitted.]</i>
        </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the effect clause of iter_swap in 25.2.2 paragraph 7 from:</p>
<blockquote>
<p>Exchanges the values pointed to by the two iterators a and b.</p>
</blockquote>
<p>to</p>
<blockquote>
<p>
                <tt>swap(*a, *b)</tt>.</p>
</blockquote>

<p>
            <i>[post-Toronto: The LWG is concerned about possible
overspecification: there may be cases, such as Dave Abrahams's example
above, and such as vector&lt;bool&gt;'s iterators, where it makes more
sense for iter_swap to do something other than swap.  If performance
is a concern, it may be better to have explicit complexity
requirements than to say how iter_swap should be implemented.]</i>
        </p>
<hr>
        <a name="197">
            <h3>197.&nbsp;max_size() underspecified</h3>
        </a>
        <p>
            <b>Section:</b> 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a>, 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andy Sawyer <b>Date:</b>&nbsp;21 Oct 1999</p>
<p>Must the value returned by max_size() be unchanged from call to call? </p>

<p>Must the value returned from max_size() be meaningful? </p>

<p>Possible meanings identified in lib-6827: </p>

<p>1) The largest container the implementation can support given "best
case" conditions - i.e. assume the run-time platform is "configured to
the max", and no overhead from the program itself. This may possibly
be determined at the point the library is written, but certainly no
later than compile time.<br>
<br>
2) The largest container the program could create, given "best case"
conditions - i.e. same platform assumptions as (1), but take into
account any overhead for executing the program itself. (or, roughly
"storage=storage-sizeof(program)"). This does NOT include any resource
allocated by the program. This may (or may not) be determinable at
compile time.<br>
<br>
3) The largest container the current execution of the program could
create, given knowledge of the actual run-time platform, but again,
not taking into account any currently allocated resource. This is
probably best determined at program start-up.<br>
<br>
4) The largest container the current execution program could create at
the point max_size() is called (or more correctly at the point
max_size() returns :-), given it's current environment (i.e. taking
into account the actual currently available resources). This,
obviously, has to be determined dynamically each time max_size() is
called. </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a> table 32 max_size() wording from:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the largest value that can meaningfully be 
passed to X::allocate<br> 
to:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the value of the largest constant expression
(5.19 <a href="expr.html#expr.const">[expr.const]</a>) that could ever meaningfully be passed to X::allocate</p>

<p>
Change 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a> table 65 max_size() wording from:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size() of the largest possible container.<br>
to:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the value of the largest constant expression
(5.19 <a href="expr.html#expr.const">[expr.const]</a>) that could ever meaningfully be returned by X::size().
</p>

<p>
            <i>[Kona: The LWG informally discussed this and asked Andy Sawyer to submit
an issue.]</i>
        </p>

<p>
            <i>[Tokyo: The LWG believes (1) above is the intended meaning.]</i>
        </p>

<p>
            <i>[Post-Tokyo: Beman Dawes supplied the above resolution at the
request of the LWG. 21.3.3 <a href="lib-strings.html#lib.string.capacity">[lib.string.capacity]</a> was not changed because it
references max_size() in 23.1.  The term "compile-time" was
avoided because it is not defined anywhere in the standard (even
though it is used several places in the library clauses).]</i>
        </p>

<p>
            <i>[Toronto: The LWG agrees with the general intent of 
the proposed resolution, but had some quibbles about the wording.
Andy Sawyer has volunteered to provide revised wording.]</i>
        </p>
<hr>
        <a name="198">
            <h3>198.&nbsp;Validity of pointers and references unspecified after iterator destruction</h3>
        </a>
        <p>
            <b>Section:</b> 24.1 <a href="lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Beman Dawes <b>Date:</b>&nbsp;3 Nov 1999</p>
<p>
Is a pointer or reference obtained from an iterator still valid after
destruction of the iterator?
</p>
<p>
Is a pointer or reference obtained from an iterator still valid after the value
of the iterator changes?
</p>
<blockquote>
<pre>
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;

int main()
{
    typedef std::vector&lt;int&gt; vec_t;
    vec_t v;
    v.push_back( 1 );

    // Is a pointer or reference obtained from an iterator still
    // valid after destruction of the iterator?
    int * p = &amp;*v.begin();
    std::cout &lt;&lt; *p &lt;&lt; '\n';  // OK?

    // Is a pointer or reference obtained from an iterator still
    // valid after the value of the iterator changes?
    vec_t::iterator iter( v.begin() );
    p = &amp;*iter++;
    std::cout &lt;&lt; *p &lt;&lt; '\n';  // OK?

    return 0;
}
</pre>
</blockquote>

<p>The standard doesn't appear to directly address these
questions. The standard needs to be clarified. At least two real-world
cases have been reported where library implementors wasted
considerable effort because of the lack of clarity in the
standard. The question is important because requiring pointers and
references to remain valid has the effect for practical purposes of
prohibiting iterators from pointing to cached rather than actual
elements of containers.</p>

<p>The standard itself assumes that pointers and references obtained
from an iterator are still valid after iterator destruction or
change. The definition of reverse_iterator::operator*(), 24.4.1.3.3 <a href="lib-iterators.html#lib.reverse.iter.op.star">[lib.reverse.iter.op.star]</a>, which returns a reference, defines
effects:</p>

<blockquote>
  <pre>Iterator tmp = current;
return *--tmp;</pre>
</blockquote>
<p>The definition of reverse_iterator::operator-&gt;(), 24.4.1.3.4 <a href="lib-iterators.html#lib.reverse.iter.opref">[lib.reverse.iter.opref]</a>, which returns a pointer, defines effects:</p>
<blockquote>
  <pre>return &amp;(operator*());</pre>
</blockquote>

<p>Because the standard itself assumes pointers and references remain
valid after iterator destruction or change, the standard should say so
explicitly. This will also reduce the chance of user code breaking
unexpectedly when porting to a different standard library
implementation.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add a new paragraph to 24.1 <a href="lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</a>:</p>
<blockquote>
Destruction of an iterator may invalidate pointers and references
previously obtained from that iterator.
</blockquote>

<p>Replace paragraph 1 of 24.4.1.3.3 <a href="lib-iterators.html#lib.reverse.iter.op.star">[lib.reverse.iter.op.star]</a> with:</p>

<blockquote>
<p>
                <b>Effects:</b>
            </p>
<pre>
  this-&gt;tmp = current;
  --this-&gt;tmp;
  return *this-&gt;tmp;
</pre>

<p>
[<i>Note:</i> This operation must use an auxiliary member variable,
rather than a temporary variable, to avoid returning a reference that
persists beyond the lifetime of its associated iterator.  (See
24.1 <a href="lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</a>.)  The name of this member variable is shown for
exposition only.  <i>--end note</i>]
</p>
</blockquote>

<p>
            <i>[Tokyo: The LWG reformulated the question purely in terms of
iterators. The answer to the question is "no, pointers and references
don't remain valid after iterator destruction." PJP explained that
implementors use considerable care to avoid such ephemeral pointers and
references. Several LWG members said that they thought that the standard
did not actually specify the lifetime of pointers and references obtained from
iterators, except possibly input iterators.]</i>
        </p>

<p>
            <i>[Post-Tokyo: The issue has been reformulated purely
in terms of iterators.]</i>
        </p>

<p>
            <i>[Pre-Toronto: Steve Cleary pointed out the no-invalidation
assumption by reverse_iterator. The issue and proposed resolution was
reformulated yet again to reflect this reality.]</i>
        </p>

<p>
            <i>[pre-Copenhagen: Andy Koenig pointed out that it is possible to 
rewrite reverse_iterator so that it no longer makes this assumption.]</i>
        </p>
<hr>
        <a name="200">
            <h3>200.&nbsp;Forward iterator requirements don't allow constant iterators</h3>
        </a>
        <p>
            <b>Section:</b> 24.1.3 <a href="lib-iterators.html#lib.forward.iterators">[lib.forward.iterators]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;19 Nov 1999</p>
<p>
In table 74, the return type of the expression <tt>*a</tt> is given
as <tt>T&amp;</tt>, where <tt>T</tt> is the iterator's value type.
For constant iterators, however, this is wrong.  ("Value type"
is never defined very precisely, but it is clear that the value type
of, say, <tt>std::list&lt;int&gt;::const_iterator</tt> is supposed to be
<tt>int</tt>, not <tt>const int</tt>.)
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In table 74, change the <b>return type</b> column for <tt>*a</tt>
from "<tt>T&amp;</tt>" to "<tt>T&amp;</tt> if
<tt>X</tt> is mutable, otherwise <tt>const T&amp;</tt>".
</p>

<p>
            <i>[Tokyo: The LWG believes this is the tip of a larger iceberg;
there are multiple const problems with the STL portion of the library
and that these should be addressed as a single package.&nbsp; Note
that issue <a href="lwg-closed.html#180">180</a> has already been declared NAD Future for
that very reason.]</i>
        </p>
<hr>
        <a name="201">
            <h3>201.&nbsp;Numeric limits terminology wrong</h3>
        </a>
        <p>
            <b>Section:</b> 18.2.1 <a href="lib-support.html#lib.limits">[lib.limits]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Stephen Cleary <b>Date:</b>&nbsp;21 Dec 1999</p>
<p>
In some places in this section, the terms "fundamental types" and
"scalar types" are used when the term "arithmetic types" is intended.
The current usage is incorrect because void is a fundamental type and
pointers are scalar types, neither of which should have
specializations of numeric_limits.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 18.2 [lib.support.limits] para 1 from:</p>
<blockquote>

<p>  The headers &lt;limits&gt;, &lt;climits&gt;, and &lt;cfloat&gt; supply characteristics of  implementation-dependent fundamental types (3.9.1).</p>
</blockquote>

<p>to:</p>
<blockquote>

<p>  The headers &lt;limits&gt;, &lt;climits&gt;, and &lt;cfloat&gt; supply characteristics of  implementation-dependent arithmetic types (3.9.1).</p>
</blockquote>

<p>Change 18.2.1 [lib.limits] para 1 from:</p>
<blockquote>

<p>  The numeric_limits component provides a C++ program with information about various  properties of the implementation's representation of the fundamental
types.</p>
</blockquote>

<p>to:</p>
<blockquote>

<p>  The numeric_limits component provides a C++ program with information about various  properties of the implementation's representation of the arithmetic
types.</p>
</blockquote>

<p>Change 18.2.1 [lib.limits] para 2 from:</p>
<blockquote>

<p>  Specializations shall be provided for each fundamental type. . .</p>
</blockquote>

<p>to:</p>
<blockquote>

<p>  Specializations shall be provided for each arithmetic type. . .</p>
</blockquote>

<p>Change 18.2.1 [lib.limits] para 4 from:</p>
<blockquote>

<p>  Non-fundamental standard types. . .</p>
</blockquote>

<p>to:</p>
<blockquote>

<p>  Non-arithmetic standard types. . .</p>
</blockquote>

<p>Change 18.2.1.1 [lib.numeric.limits] para 1 from:</p>
<blockquote>

<p>  The member is_specialized makes it possible to distinguish between fundamental types,  which have specializations, and non-scalar types, which
do not.</p>
</blockquote>

<p>to:</p>
<blockquote>

<p>  The member is_specialized makes it possible to distinguish between arithmetic types,  which have specializations, and non-arithmetic types,
which do not.</p>
</blockquote>

<p>
            <i>[post-Toronto: The opinion of the LWG is that the wording in the
standard, as well as the wording of the proposed resolution, is
flawed.  The term "arithmetic types" is well defined in C
and C++, and it is not clear that the term is being used correctly.
It is also not clear that the term "implementation
dependent" has any useful meaning in this context.  The biggest
problem is that numeric_limits seems to be intended both for built-in
types and for user-defined types, and the standard doesn't make it
clear how numeric_limits applies to each of those cases.  A wholesale
review of numeric_limits is needed.  A paper would be welcome.]</i>
        </p>
<hr>
        <a name="202">
            <h3>202.&nbsp;unique() effects unclear when predicate not an equivalence relation</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.8 <a href="lib-algorithms.html#lib.alg.unique">[lib.alg.unique]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andrew Koenig <b>Date:</b>&nbsp;13 Jan 2000</p>
<p>
What should unique() do if you give it a predicate that is not an
equivalence relation?  There are at least two plausible answers:
</p>

<blockquote>

<p>
   1. You can't, because 25.2.8 says that it it "eliminates all but
   the first element from every consecutive group of equal
   elements..." and it wouldn't make sense to interpret "equal" as
   meaning anything but an equivalence relation.  [It also doesn't
   make sense to interpret "equal" as meaning ==, because then there
   would never be any sense in giving a predicate as an argument at
   all.]
</p>

<p>
   2. The word "equal" should be interpreted to mean whatever the
   predicate says, even if it is not an equivalence relation
   (and in particular, even if it is not transitive).
</p>

</blockquote>

<p>
The example that raised this question is from Usenet:
</p>

<blockquote>

<pre>int f[] = { 1, 3, 7, 1, 2 };
int* z = unique(f, f+5, greater&lt;int&gt;());</pre>

</blockquote>

<p>
If one blindly applies the definition using the predicate
greater&lt;int&gt;, and ignore the word "equal", you get:
</p>

<blockquote>

<p>
    Eliminates all but the first element from every consecutive group    
    of elements referred to by the iterator i in the range [first, last)    
    for which *i &gt; *(i - 1).
</p>

</blockquote>

<p>
The first surprise is the order of the comparison.  If we wanted to
allow for the predicate not being an equivalence relation, then we
should surely compare elements the other way: pred(*(i - 1), *i).  If
we do that, then the description would seem to say: "Break the
sequence into subsequences whose elements are in strictly increasing
order, and keep only the first element of each subsequence".  So the
result would be 1, 1, 2.  If we take the description at its word, it
would seem to call for strictly DEcreasing order, in which case the
result should be 1, 3, 7, 2.<br>
<br>
In fact, the SGI implementation of unique() does neither: It yields 1,
3, 7.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Options:</p>
<blockquote>
  <p>     1. Impose an explicit requirement that the predicate be an
             equivalence relation.&nbsp;</p>
  <p>     2. Drop the word "equal" from the description to make it clear that
             the intent is to compare pairs of adjacent elements.</p>
  <p>     3. Change the effects to:</p>
             <blockquote>
             Effects: Eliminates all but the first element e from
             every consecutive group of elements referred to by the
             iterator i in the range [first, last) for which the
             following corresponding conditions hold: e == *i or
             pred(e,*i) != false.
             </blockquote>
</blockquote>
<p>If we adopt (2), we also need to decide whether pred(*i, *(i - 1))
is really what we meant, or whether pred(*(i - 1), i) is more
appropriate.
</p>
<p>A LWG member, Nico Josuttis, comments:</p>
<p>First, I agree that the current wording is simply wrong. However, to follow
all [known] current implementations I propose [option 3 above].</p>

<p>
            <i>[ Tokyo: The issue was discussed at length without reaching
consensus.  Straw vote: Option 1 - preferred by 2 people.  Option 2 -
preferred by 0 people. Option 3 - preferred by 3 people.  Many
abstentions.  ]</i>
        </p>
<hr>
        <a name="214">
            <h3>214.&nbsp;set::find() missing const overload</h3>
        </a>
        <p>
            <b>Section:</b> 23.3.3 <a href="lib-containers.html#lib.set">[lib.set]</a>, 23.3.4 <a href="lib-containers.html#lib.multiset">[lib.multiset]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;28 Feb 2000</p>
<p>The specification for the associative container requirements in
Table 69 state that the find member function should "return
iterator; const_iterator for constant a". The map and multimap
container descriptions have two overloaded versions of find, but set
and multiset do not, all they have is:</p>
<blockquote>
  <pre>iterator find(const key_type &amp; x) const;</pre>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the prototypes for find(), lower_bound(), upper_bound(), and
equal_range() in section 23.3.3 <a href="lib-containers.html#lib.set">[lib.set]</a> and section 23.3.4 <a href="lib-containers.html#lib.multiset">[lib.multiset]</a> to each have two overloads:</p>
<blockquote>
  <pre>iterator find(const key_type &amp; x);
const_iterator find(const key_type &amp; x) const;</pre>
  <pre>iterator lower_bound(const key_type &amp; x);
const_iterator lower_bound(const key_type &amp; x) const;</pre>
  <pre>iterator upper_bound(const key_type &amp; x);
const_iterator upper_bound(const key_type &amp; x) const;</pre>
  <pre>pair&lt;iterator, iterator&gt; equal_range(const key_type &amp; x);
pair&lt;const_iterator, const_iterator&gt; equal_range(const key_type &amp; x) const;</pre>
</blockquote>

<p>
            <i>[Tokyo: At the request of the LWG, Judy Ward provided wording
extending the proposed resolution to lower_bound, upper_bound, and
equal_range.]</i>
        </p>
<hr>
        <a name="221">
            <h3>221.&nbsp;num_get&lt;&gt;::do_get stage 2 processing broken</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.2.1.2 <a href="lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;14 Mar 2000</p>
<p>Stage 2 processing of numeric conversion is broken.</p>

<p>Table 55 in 22.2.2.1.2 says that when basefield is 0 the integral
conversion specifier is %i. A %i specifier determines a number's base
by its prefix (0 for octal, 0x for hex), so the intention is clearly
that a 0x prefix is allowed.  Paragraph 8 in the same section,
however, describes very precisely how characters are processed. (It
must be done "as if" by a specified code fragment.) That
description does not allow a 0x prefix to be recognized.</p>

<p>Very roughly, stage 2 processing reads a char_type ct. It converts
ct to a char, not by using narrow but by looking it up in a
translation table that was created by widening the string literal
"0123456789abcdefABCDEF+-". The character "x" is
not found in that table, so it can't be recognized by stage 2
processing.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 22.2.2.1.2 paragraph 8, replace the line:</p>
<blockquote>
  <pre>static const char src[] = "0123456789abcdefABCDEF+-";</pre>
</blockquote>
<p>with the line:</p>
<blockquote>
  <pre>static const char src[] = "0123456789abcdefxABCDEFX+-";</pre>
</blockquote>
<hr>
        <a name="225">
            <h3>225.&nbsp;std:: algorithms use of other unqualified algorithms</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.4.3 <a href="lib-intro.html#lib.global.functions">[lib.global.functions]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dave Abrahams <b>Date:</b>&nbsp;01 Apr 2000</p>
<p>Are algorithms in std:: allowed to use other algorithms without qualification, so functions in
user namespaces might be found through Koenig lookup?</p>
<p>For example, a popular standard library implementation includes this
implementation of std::unique:</p>
<blockquote>
<pre>namespace std {
    template &lt;class _ForwardIter&gt;
    _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
      __first = adjacent_find(__first, __last);
      return unique_copy(__first, __last, __first);
    }
    }</pre>
</blockquote>
<p>Imagine two users on opposite sides of town, each using unique on his own
sequences bounded by my_iterators . User1 looks at his standard library
implementation and says, "I know how to implement a more efficient
unique_copy for my_iterators", and writes:</p>
<blockquote>
<pre>namespace user1 {
    class my_iterator;
    // faster version for my_iterator
    my_iterator unique_copy(my_iterator, my_iterator, my_iterator);
    }</pre>
</blockquote>
<p>user1::unique_copy() is selected by Koenig lookup, as he intended.</p>
<p>User2 has other needs, and writes:</p>
<blockquote>
<pre>namespace user2 {
    class my_iterator;
    // Returns true iff *c is a unique copy of *a and *b.
    bool unique_copy(my_iterator a, my_iterator b, my_iterator c);
    }</pre>
</blockquote>
<p>User2 is shocked to find later that his fully-qualified use of
std::unique(user2::my_iterator, user2::my_iterator, user2::my_iterator) fails to
compile (if he's lucky). Looking in the standard, he sees the following Effects
clause for unique():</p>
<blockquote>
  <p>Effects: Eliminates all but the first element from every consecutive group
  of equal elements referred to by the iterator i in the range [first, last) for
  which the following corresponding conditions hold: *i == *(i - 1) or pred(*i,
  *(i - 1)) != false</p>
</blockquote>
<p>The standard gives user2 absolutely no reason to think he can interfere with
std::unique by defining names in namespace user2. His standard library has been
built with the template export feature, so he is unable to inspect the
implementation. User1 eventually compiles his code with another compiler, and
his version of unique_copy silently stops being called. Eventually, he realizes
that he was depending on an implementation detail of his library and had no
right to expect his unique_copy() to be called portably.</p>
<p>On the face of it, and given above scenario, it may seem obvious that the
implementation of unique() shown is non-conforming because it uses unique_copy()
rather than ::std::unique_copy(). Most standard library implementations,
however, seem to disagree with this notion.</p>
<p> <i>[Tokyo:&nbsp; Steve Adamczyk from
the core working group indicates that "std::" is sufficient;&nbsp;
leading "::" qualification is not required because any namespace
qualification is sufficient to suppress Koenig lookup.]</i>
        </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add a paragraph and a note at the end of 
17.4.4.3 <a href="lib-intro.html#lib.global.functions">[lib.global.functions]</a>:</p>
<blockquote>

<p>Unless otherwise specified, no global or non-member function in the
standard library shall use a function from another namespace which is
found through <i>argument-dependent name lookup</i> (3.4.2 <a href="basic.html#basic.lookup.koenig">[basic.lookup.koenig]</a>).</p>

<p>[Note: the phrase "unless otherwise specified" is intended to
allow Koenig lookup in cases like that of ostream_iterators:<br>

<br>
  Effects:</p>
  <blockquote>
<p>*out_stream &lt;&lt; value;<br>
      if(delim != 0) *out_stream &lt;&lt; delim;<br>
      return (*this);</p>
    <p>--end note]</p>
  </blockquote>
</blockquote>

<p>
            <i>[Tokyo: The LWG agrees that this is a defect in the standard, but
is as yet unsure if the proposed resolution is the best
solution. Furthermore, the LWG believes that the same problem of
unqualified library names applies to wording in the standard itself,
and has opened issue <a href="lwg-active.html#229">229</a> accordingly. Any resolution of
issue <a href="lwg-active.html#225">225</a> should be coordinated with the resolution of
issue <a href="lwg-active.html#229">229</a>.]</i>
        </p>

<p>
            <i>[Toronto: The LWG is not sure if this is a defect in the
standard.  Most LWG members believe that an implementation of
<tt>std::unique</tt> like the one quoted in this issue is already
illegal, since, under certain circumstances, its semantics are not
those specified in the standard.  The standard's description of
<tt>unique</tt> does not say that overloading <tt>adjacent_find</tt>
should have any effect.]</i>
        </p>
<hr>
        <a name="226">
            <h3>226.&nbsp;User supplied specializations or overloads of namespace std function templates</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.3.1 <a href="lib-intro.html#lib.reserved.names">[lib.reserved.names]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dave Abrahams <b>Date:</b>&nbsp;01 Apr 2000</p>
<p>The issues are:&nbsp;</p>
<p>1. How can a 3rd party library implementor (lib1) write a version of a standard
algorithm which is specialized to work with his own class template?&nbsp;</p>
<p>2. How can another library implementor (lib2) write a generic algorithm which 
will take advantage of the specialized algorithm in lib1?</p>
<p>This appears to be the only viable answer under current language rules:</p>
<blockquote>
  <pre>namespace lib1
{
    // arbitrary-precision numbers using T as a basic unit
    template &lt;class T&gt;
    class big_num { //...
    };
    </pre>
  <pre>    // defining this in namespace std is illegal (it would be an
    // overload), so we hope users will rely on Koenig lookup
    template &lt;class T&gt;
    void swap(big_int&lt;T&gt;&amp;, big_int&lt;T&gt;&amp;);
}</pre>
  <pre>#include &lt;algorithm&gt;
namespace lib2
{
    template &lt;class T&gt;
    void generic_sort(T* start, T* end)
    {
            ...
        // using-declaration required so we can work on built-in types
        using std::swap;
        // use Koenig lookup to find specialized algorithm if available
        swap(*x, *y);
    }
}</pre>
</blockquote>
<p>This answer has some drawbacks. First of all, it makes writing lib2 difficult
and somewhat slippery. The implementor needs to remember to write the
using-declaration, or generic_sort will fail to compile when T is a built-in
type. The second drawback is that the use of this style in lib2 effectively
"reserves" names in any namespace which defines types which may
eventually be used with lib2. This may seem innocuous at first when applied to
names like swap, but consider more ambiguous names like unique_copy() instead.
It is easy to imagine the user wanting to define these names differently in his
own namespace. A definition with semantics incompatible with the standard
library could cause serious problems (see issue <a href="lwg-active.html#225">225</a>).</p>
<p>Why, you may ask, can't we just partially specialize std::swap()? It's
because the language doesn't allow for partial specialization of function
templates. If you write:</p>
<blockquote>
  <pre>namespace std
{
    template &lt;class T&gt;
    void swap(lib1::big_int&lt;T&gt;&amp;, lib1::big_int&lt;T&gt;&amp;);
}</pre>
</blockquote>
<p>You have just overloaded std::swap, which is illegal under the current
language rules. On the other hand, the following full specialization is legal:</p>
<blockquote>
  <pre>namespace std
{
    template &lt;&gt;
    void swap(lib1::other_type&amp;, lib1::other_type&amp;);
}</pre>
</blockquote>

<p>This issue reflects concerns raised by the "Namespace issue
with specialized swap" thread on comp.lang.c++.moderated. A
similar set of concerns was earlier raised on the boost.org mailing
list and the ACCU-general mailing list.  Also see library reflector
message c++std-lib-7354.</p>

<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[Tokyo: Summary, "There is no conforming way to extend
std::swap for user defined templates."&nbsp; The LWG agrees that
there is a problem.&nbsp; Would like more information before
proceeding. This may be a core issue.  Core issue 229 has been opened
to discuss the core aspects of this problem. It was also noted that
submissions regarding this issue have been received from several
sources, but too late to be integrated into the issues list.
]</i>
        </p>

<p>
            <i>[Post-Tokyo: A paper with several proposed resolutions,
J16/00-0029==WG21/N1252, "Shades of namespace std functions
" by Alan Griffiths, is in the Post-Tokyo mailing. It
should be considered a part of this issue.]</i>
        </p>

<p>
            <i>[Toronto: Dave Abrahams and Peter Dimov have proposed a
resolution that involves core changes: it would add partial
specialization of function template.  The Core Working Group is
reluctant to add partial specialization of function templates.  It is
viewed as a large change, CWG believes that proposal presented leaves
some syntactic issues unanswered; if the CWG does add partial
specialization of function templates, it wishes to develop its own
proposal.  The LWG continues to believe that there is a serious
problem: there is no good way for users to force the library to use
user specializations of generic standard library functions, and in
certain cases (e.g. transcendental functions called by
<tt>valarray</tt> and <tt>complex</tt>) this is important.  Koenig
lookup isn't adequate, since names within the library must be
qualified with <tt>std</tt> (see issue 225), specialization doesn't
work (we don't have partial specialization of function templates), and
users aren't permitted to add overloads within namespace std.
Possible solutions discussed by the LWG include: (1) allowing users to
add overloads within namespace std, provided that the user-defined
overload has the same semantics as the function being overloaded.  (2)
Specifying a special set of names, such as <tt>swap</tt> and
<tt>abs</tt> which library components must refer to without
qualification; all names not on this list must be qualified by
<tt>std::</tt>.  (There are many possible variations on this issue.
For example, we might say that a function <tt>f</tt> should always be
unqualified within <tt>g</tt> whenever <tt>g</tt>'s description in the
standard says that it calls <tt>f</tt>.)  (3) Asking CWG to revisit
partial specialization of function template.
]</i>
        </p>
<hr>
        <a name="228">
            <h3>228.&nbsp;Incorrect specification of "..._byname" facets</h3>
        </a>
        <p>
            <b>Section:</b> 22.2 <a href="lib-locales.html#lib.locale.categories">[lib.locale.categories]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;20 Apr 2000</p>
<p>The sections 22.2.1.2 <a href="lib-locales.html#lib.locale.ctype.byname">[lib.locale.ctype.byname]</a>, 22.2.1.4 <a href="lib-locales.html#lib.locale.ctype.byname.special">[lib.locale.ctype.byname.special]</a>,
22.2.1.6 <a href="lib-locales.html#lib.locale.codecvt.byname">[lib.locale.codecvt.byname]</a>, 22.2.3.2 <a href="lib-locales.html#lib.locale.numpunct.byname">[lib.locale.numpunct.byname]</a>, 22.2.4.2 <a href="lib-locales.html#lib.locale.collate.byname">[lib.locale.collate.byname]</a>, 22.2.5.4 <a href="lib-locales.html#lib.locale.time.put.byname">[lib.locale.time.put.byname]</a>, 22.2.6.4 <a href="lib-locales.html#lib.locale.moneypunct.byname">[lib.locale.moneypunct.byname]</a>, and 22.2.7.2 <a href="lib-locales.html#lib.locale.messages.byname">[lib.locale.messages.byname]</a> overspecify the
definitions of the "..._byname" classes by listing a bunch
of virtual functions. At the same time, no semantics of these
functions are defined. Real implementations do not define these
functions because the functional part of the facets is actually
implemented in the corresponding base classes and the constructor of
the "..._byname" version just provides suitable date used by
these implementations. For example, the 'numpunct' methods just return
values from a struct. The base class uses a statically initialized
struct while the derived version reads the contents of this struct
from a table.  However, no virtual function is defined in
'numpunct_byname'.</p>

<p>For most classes this does not impose a problem but specifically
for 'ctype' it does: The specialization for 'ctype_byname&lt;char&gt;'
is required because otherwise the semantics would change due to the
virtual functions defined in the general version for 'ctype_byname':
In 'ctype&lt;char&gt;' the method 'do_is()' is not virtual but it is
made virtual in both 'ctype&lt;cT&gt;' and 'ctype_byname&lt;cT&gt;'.
Thus, a class derived from 'ctype_byname&lt;char&gt;' can tell whether
this class is specialized or not under the current specification:
Without the specialization, 'do_is()' is virtual while with
specialization it is not virtual.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>&nbsp; Change section 22.2.1.2 (lib.locale.ctype.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT&gt;
       class ctype_byname : public ctype&lt;charT&gt; {
       public:
         typedef ctype&lt;charT&gt;::mask mask;
         explicit ctype_byname(const char*, size_t refs = 0);
       protected:
        ~ctype_byname();             //  virtual
       };
     }</pre>
<p>&nbsp; Change section 22.2.1.6 (lib.locale.codecvt.byname) to become:</p>
<pre>    namespace std {
      template &lt;class internT, class externT, class stateT&gt;
      class codecvt_byname : public codecvt&lt;internT, externT, stateT&gt; {
      public:
       explicit codecvt_byname(const char*, size_t refs = 0);
      protected:
      ~codecvt_byname();             //  virtual
       };
     }
</pre>
<p>&nbsp; Change section 22.2.3.2 (lib.locale.numpunct.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT&gt;
       class numpunct_byname : public numpunct&lt;charT&gt; {
     //  this class is specialized for  char  and  wchar_t.
       public:
         typedef charT                char_type;
         typedef basic_string&lt;charT&gt;  string_type;
         explicit numpunct_byname(const char*, size_t refs = 0);
       protected:
        ~numpunct_byname();          //  virtual
       };
     }</pre>
<p>&nbsp; Change section 22.2.4.2 (lib.locale.collate.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT&gt;
       class collate_byname : public collate&lt;charT&gt; {
       public:
         typedef basic_string&lt;charT&gt; string_type;
         explicit collate_byname(const char*, size_t refs = 0);
       protected:
        ~collate_byname();           //  virtual
       };
     }</pre>
<p>&nbsp; Change section 22.2.5.2 (lib.locale.time.get.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT, class InputIterator = istreambuf_iterator&lt;charT&gt; &gt;
       class time_get_byname : public time_get&lt;charT, InputIterator&gt; {
       public:
         typedef time_base::dateorder dateorder;
         typedef InputIterator        iter_type</pre>
<pre>         explicit time_get_byname(const char*, size_t refs = 0);
       protected:
        ~time_get_byname();          //  virtual
       };
     }</pre>
<p>&nbsp; Change section 22.2.5.4 (lib.locale.time.put.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT, class OutputIterator = ostreambuf_iterator&lt;charT&gt; &gt;
       class time_put_byname : public time_put&lt;charT, OutputIterator&gt;
       {
       public:
         typedef charT          char_type;
         typedef OutputIterator iter_type;</pre>
<pre>         explicit time_put_byname(const char*, size_t refs = 0);
       protected:
        ~time_put_byname();          //  virtual
       };
     }"</pre>
<p>&nbsp; Change section 22.2.6.4 (lib.locale.moneypunct.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT, bool Intl = false&gt;
       class moneypunct_byname : public moneypunct&lt;charT, Intl&gt; {
       public:
         typedef money_base::pattern pattern;
         typedef basic_string&lt;charT&gt; string_type;</pre>
<pre>         explicit moneypunct_byname(const char*, size_t refs = 0);
       protected:
        ~moneypunct_byname();        //  virtual
       };
     }</pre>
<p>&nbsp; Change section 22.2.7.2 (lib.locale.messages.byname) to become:</p>
<pre>     namespace std {
       template &lt;class charT&gt;
       class messages_byname : public messages&lt;charT&gt; {
       public:
         typedef messages_base::catalog catalog;
         typedef basic_string&lt;charT&gt;    string_type;</pre>
<pre>         explicit messages_byname(const char*, size_t refs = 0);
       protected:
        ~messages_byname();          //  virtual
         virtual catalog do_open(const basic_string&lt;char&gt;&amp;, const locale&amp;) const;
         virtual string_type  do_get(catalog, int set, int msgid,
                                const string_type&amp; dfault) const;
         virtual void    do_close(catalog) const;
       };
     }</pre>
<p>Remove section 22.2.1.4 <a href="lib-locales.html#lib.locale.ctype.byname.special">[lib.locale.ctype.byname.special]</a> completely (because in
this case only those members are defined to be virtual which are
defined to be virtual in 'ctype&lt;cT&gt;'.)</p>

<p>
            <i>[Post-Tokyo: Dietmar K&uuml;hl submitted this issue at the request of
the LWG to solve the underlying problems raised by issue <a href="lwg-closed.html#138">138</a>.]</i>
        </p>
<hr>
        <a name="229">
            <h3>229.&nbsp;Unqualified references of other library entities</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.1.1 <a href="lib-intro.html#lib.contents">[lib.contents]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Steve Clamage <b>Date:</b>&nbsp;19 Apr 2000</p>
<p>Throughout the library chapters, the descriptions of library entities refer
to other library entities without necessarily qualifying the names.</p>

<p>For example, section 25.2.2 "Swap" describes the effect of
swap_ranges in terms of the unqualified name "swap". This section
could reasonably be interpreted to mean that the library must be implemented so
as to do a lookup of the unqualified name "swap", allowing users to
override any ::std::swap function when Koenig lookup applies.</p>

<p>Although it would have been best to use explicit qualification with
"::std::" throughout, too many lines in the standard would have to be
adjusted to make that change in a Technical Corrigendum.</p>

<p>Issue <a href="lwg-active.html#182">182</a>, which addresses qualification of
<tt>size_t</tt>, is a special case of this.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>To section 17.4.1.1 "Library contents" Add the following paragraph:</p>
<blockquote>
  <p>Whenever a name x defined in the standard library is mentioned, the name x
  is assumed to be fully qualified as ::std::x, unless explicitly described
  otherwise. For example, if the Effects section for library function F is
  described as calling library function G, the function ::std::G is meant.</p>
</blockquote>

<p>
            <i>[Post-Tokyo: Steve Clamage submitted this issue at the request of
the LWG to solve a problem in the standard itself similar to the
problem within implementations of library identified by issue <a href="lwg-active.html#225">225</a>.  Any resolution of issue <a href="lwg-active.html#225">225</a> should be
coordinated with the resolution of this issue.]</i>
        </p>

<p>
            <i>[post-Toronto: Howard is undecided about whether it is
appropriate for all standard library function names referred to in
other standard library functions to be explicitly qualified by
<tt>std</tt>: it is common advice that users should define global
functions that operate on their class in the same namespace as the 
class, and this requires argument-dependent lookup if those functions
are intended to be called by library code.  Several LWG members are
concerned that valarray appears to require argument-dependent lookup,
but that the wording may not be clear enough to fall under
"unless explicitly described otherwise".]</i>
        </p>
<hr>
        <a name="230">
            <h3>230.&nbsp;Assignable specified without also specifying CopyConstructible</h3>
        </a>
        <p>
            <b>Section:</b> 17 <a href="lib-intro.html#lib.library">[lib.library]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Beman Dawes <b>Date:</b>&nbsp;26 Apr 2000</p>
<p>Issue <a href="lwg-defects.html#227">227</a> identified an instance (std::swap) where
Assignable was specified without also specifying
CopyConstructible. The LWG asked that the standard be searched to
determine if the same defect existed elsewhere.</p>

<p>There are a number of places (see proposed resolution below) where
Assignable is specified without also specifying
CopyConstructible. There are also several cases where both are
specified. For example, 26.4.1 <a href="lib-numerics.html#lib.accumulate">[lib.accumulate]</a>.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In  23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a> table 65 for value_type:
change "T is Assignable" to "T is CopyConstructible and
Assignable"
</p>

<p>In 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a> table 69 X::key_type; change
"Key is Assignable" to "Key is
CopyConstructible and Assignable"<br>
</p>

<p>In 24.1.2 <a href="lib-iterators.html#lib.output.iterators">[lib.output.iterators]</a> paragraph 1, change:
</p>
<blockquote>
<p> A class or a built-in type X satisfies the requirements of an
output iterator if X is an Assignable type (23.1) and also the
following expressions are valid, as shown in Table 73:
</p>
</blockquote>
<p>to:
</p>
<blockquote>
<p> A class or a built-in type X satisfies the requirements of an
output iterator if X is a CopyConstructible (20.1.3) and Assignable
type (23.1) and also the following expressions are valid, as shown in
Table 73:
</p>
</blockquote>

<p>
            <i>[Post-Tokyo: Beman Dawes submitted this issue at the request of
the LWG.  He asks that the 25.2.4 <a href="lib-algorithms.html#lib.alg.replace">[lib.alg.replace]</a> and 25.2.5 <a href="lib-algorithms.html#lib.alg.fill">[lib.alg.fill]</a> changes be studied carefully, as it is not clear that
CopyConstructible is really a requirement and may be
overspecification.]</i>
        </p>
<p>
            <b>Rationale:</b>
        </p>
<p>The original proposed resolution also included changes to input
iterator, fill, and replace.  The LWG believes that those changes are
not necessary.  The LWG considered some blanket statement, where an
Assignable type was also required to be Copy Constructible, but
decided against this because fill and replace really don't require the
Copy Constructible property.</p>
<hr>
        <a name="231">
            <h3>231.&nbsp;Precision in iostream?</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.2.2.2 <a href="lib-locales.html#lib.facet.num.put.virtuals">[lib.facet.num.put.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;James Kanze, Stephen Clamage <b>Date:</b>&nbsp; 25 Apr 2000</p>
<p>What is the following program supposed to output?</p>
<pre>#include &lt;iostream&gt;

    int
    main()
    {
        std::cout.setf( std::ios::scientific , std::ios::floatfield ) ;
        std::cout.precision( 0 ) ;
        std::cout &lt;&lt; 1.23 &lt;&lt; '\n' ;
        return 0 ;
    }</pre>
<p>From my C experience, I would expect "1e+00"; this is what 
<tt>printf("%.0e" , 1.23 );</tt> does. G++ outputs 
"1.000000e+00".</p>

<p>The only indication I can find in the standard is 22.2.2.2.2/11,
where it says "For conversion from a floating-point type, if
(flags &amp; fixed) != 0 or if str.precision() &gt; 0, then
str.precision() is specified in the conversion specification."
This is an obvious error, however, fixed is not a mask for a field,
but a value that a multi-bit field may take -- the results of and'ing
fmtflags with ios::fixed are not defined, at least not if
ios::scientific has been set. G++'s behavior corresponds to what might
happen if you do use (flags &amp; fixed) != 0 with a typical
implementation (floatfield == 3 &lt;&lt; something, fixed == 1
&lt;&lt; something, and scientific == 2 &lt;&lt; something).</p>

<p>Presumably, the intent is either (flags &amp; floatfield) != 0, or
(flags &amp; floatfield) == fixed; the first gives something more or
less like the effect of precision in a printf floating point
conversion. Only more or less, of course. In order to implement printf
formatting correctly, you must know whether the precision was
explicitly set or not. Say by initializing it to -1, instead of 6, and
stating that for floating point conversions, if precision &lt; -1, 6
will be used, for fixed point, if precision &lt; -1, 1 will be used,
etc. Plus, of course, if precision == 0 and flags &amp; floatfield ==
0, 1 should be = used. But it probably isn't necessary to emulate all
of the anomalies of printf:-).</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In 22.2.2.2.2 <a href="lib-locales.html#lib.facet.num.put.virtuals">[lib.facet.num.put.virtuals]</a>, paragraph 11, change 
"if <tt>(flags &amp; fixed) != 0</tt>" to 
"if <tt>(flags &amp; floatfield) == fixed</tt>"
</p>

<p>
            <i>[post-Toronto: Matt supplied the proposed resolution.  It makes
more sense to have "if <tt>(flags &amp; floatfield) == fixed</tt>"
than to have "if <tt>(flags &amp; floatfield) != 0</tt>" because
the latter would mean there was no way to specify %f format with
a precision of zero, which is meaningful.  (%e or %g format with
a precision of zero is not meaningful, and <tt>printf</tt> will 
treat them the same way as if the precision was 1.)]</i>
        </p>

<hr>
        <a name="232">
            <h3>232.&nbsp;"depends" poorly defined in 17.4.3.1</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.3.1 <a href="lib-intro.html#lib.reserved.names">[lib.reserved.names]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Peter Dimov <b>Date:</b>&nbsp;18 Apr 2000</p>
<p>17.4.3.1/1 uses the term "depends" to limit the set of allowed
specializations of standard templates to those that "depend on a
user-defined name of external linkage."</p>
<p>This term, however, is not adequately defined, making it possible to
construct a specialization that is, I believe, technically legal according to
17.4.3.1/1, but that specializes a standard template for a built-in type such as
'int'.</p>
<p>The following code demonstrates the problem:</p>
<blockquote>
  <pre>#include &lt;algorithm&gt;</pre>
  <pre>template&lt;class T&gt; struct X
{
 typedef T type;
};</pre>
  <pre>namespace std
{
 template&lt;&gt; void swap(::X&lt;int&gt;::type&amp; i, ::X&lt;int&gt;::type&amp; j);
}</pre>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change "user-defined name" to "user-defined
type".</p>
<p>
            <b>Rationale:</b>
        </p>
<p>This terminology is used in section 2.5.2 and 4.1.1 of <i>The C++
Programming Language</i>.  It disallows the example in the issue,
since the underlying type itself is not user-defined.  The only
possible problem I can see is for non-type templates, but there's no
possible way for a user to come up with a specialization for bitset,
for example, that might not have already been specialized by the
implementor?</p>

<p>
            <i>[Toronto: this may be related to issue <a href="lwg-active.html#120">120</a>.]</i>
        </p>

<p>
            <i>[post-Toronto: Judy provided the above proposed resolution and
rationale.]</i>
        </p>
<hr>
        <a name="233">
            <h3>233.&nbsp;Insertion hints in associative containers</h3>
        </a>
        <p>
            <b>Section:</b> 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andrew Koenig <b>Date:</b>&nbsp;30 Apr 2000</p>
<p>
If <tt>mm</tt> is a multimap and <tt>p</tt> is an iterator
into the multimap, then <tt>mm.insert(p, x)</tt> inserts
<tt>x</tt> into <tt>mm</tt> with <tt>p</tt> as a hint as
to where it should go.  Table 69 claims that the execution time is
amortized constant if the insert winds up taking place adjacent to
<tt>p</tt>, but does not say when, if ever, this is guaranteed to
happen.  All it says it that <tt>p</tt> is a hint as to where to
insert.
</p>
<p>
The question is whether there is any guarantee about the relationship
between <tt>p</tt> and the insertion point, and, if so, what it
is.
</p>
<p>
I believe the present state is that there is no guarantee: The user
can supply <tt>p</tt>, and the implementation is allowed to
disregard it entirely.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
OPTION 1:<br>
General Idea:
Point out that in insert(p,t), the iterator p will (if possible)
be used to insert t just before p or just after p.  If this is
not possible, the hint is ignored.
</p>

<p>
assertion/note/pre/postcondition in table 69<br>
Change: 
</p>
<blockquote>
iterator p is a hint pointing to where the insert should start to search.
</blockquote>
<p>To:</p>
<blockquote>
if t is inserted, p is used as follows: insert t right before p
if possible;  otherwise, insert t right after p if possible;
otherwise, p is ignored.
</blockquote>
<p>
complexity:<br>
Change:
</p>
<blockquote>right after p</blockquote>
<p>To:</p>
<blockquote>right before or right after p.</blockquote> 

<p>
Thus making:<br>
assertion/note/pre/postcondition:
</p>
<blockquote>
inserts t if and only if there is no element with key equivalent to
the key of t in containers with unique keys; always inserts t in
containers with equivalent keys. always returns the iterator pointing
to the element with key equivalent to the key of t.
if t is inserted, p is used as follows: insert t right before p
if possible;  otherwise, insert t right after p if possible;
otherwise, p is ignored.
</blockquote>
<p>complexity:</p>
<blockquote>
logarithmic in general, but amortized constant if t is inserted right
before or right after p.     
</blockquote>


<p>
OPTION 2<br>
General Idea (Andrew Koenig):
t is inserted at the point closest to (the point immediately
ahead of) p. That would give the user a way of controlling the order
in which elements appear that have equal keys. Doing so would be
particularly easy in two cases that I suspect are common:
</p>
<pre>
  mm.insert(mm.begin(), t); // inserts as first element of set of equal keys
  mm.insert(mm.end(), t);   // inserts as last element of set of equal keys
</pre>

<p>
These examples would allow t to be inserted at the beginning and end,
respectively, of the set of elements with the same key as t. 
</p>

<p>
assertion/note/pre/postcondition in table 69<br>
Change: 
</p>
<blockquote>
iterator p is a hint pointing to where the insert should start to search.
</blockquote>
<p>To:</p>
<blockquote>
if t is inserted, p is used as follows: insert t right before p
if possible;  otherwise, if p is equal to a.end(), or if the key value
of t is greater than the key value of *p, t is inserted just before
a.lowerbound(the key value of t); otherwise, t is inserted right
before a.upperbound(the key value of t).
</blockquote>
<p>complexity:<br>
Change:</p>
<blockquote>right after p</blockquote>
<p>To:</p>
<blockquote>right before p</blockquote>

<p>
Thus making:<br>
assertion/note/pre/postcondition:
</p>
<blockquote>
inserts t if and only if there is no element with key equivalent to
the key of t in containers with unique keys; always inserts t in
containers with equivalent keys. always returns the iterator pointing
to the element with key equivalent to the key of t.
if t is inserted, p is used as follows: insert t right before p
if possible;  otherwise, if p is equal to a.end(), or if the key value
of t is greater than the key value of *p, t is inserted just before
a.lowerbound(the key value of t); otherwise, t is inserted right
before a.upperbound(the key value of t).
<br>NON-NORMATIVE FOOTNOTE:
| This gives the user a way of controlling the order
| in which elements appear that have equal keys. Doing this is
| particularly easy in two common cases:
<pre>
| mm.insert(mm.begin(), t); // inserts as first element of set of equal keys
| mm.insert(mm.end(), t);   // inserts as last element of set of equal keys
</pre>
<br>END-FOOTNOTE
</blockquote>

<p>complexity:</p>
<blockquote>
logarithmic in general, but amortized constant if t is inserted right
before p.
</blockquote>

<p>
            <i>[Toronto: there was general agreement that this is a real
defect: when inserting an element x into a multiset that already
contains several copies of x, there is no way to know whether the hint
will be used.  There was some support for an alternative resolution:
we check on both sides of the hint (both before and after, in that
order).  If either is the correct location, the hint is used;
otherwise it is not.  This is different from the original proposed
resolution, because in the proposed resolution the hint will be used
even if it is very far from the insertion point.  JC van Winkel
supplied precise wording for both options.]</i>
        </p>
<hr>
        <a name="234">
            <h3>234.&nbsp;Typos in allocator definition</h3>
        </a>
        <p>
            <b>Section:</b> 20.4.1.1 <a href="lib-utilities.html#lib.allocator.members">[lib.allocator.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;24 Apr 2000</p>
<p>In paragraphs 12 and 13 the effects of <tt>construct()</tt> and
<tt>destruct()</tt> are described as returns but the functions actually
return <tt>void</tt>.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Substitute "Returns" by "Effect".</p>
<hr>
        <a name="235">
            <h3>235.&nbsp;No specification of default ctor for reverse_iterator</h3>
        </a>
        <p>
            <b>Section:</b> 24.4.1.1 <a href="lib-iterators.html#lib.reverse.iterator">[lib.reverse.iterator]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;24 Apr 2000</p>
<p>The declaration of <tt>reverse_iterator</tt> lists a default
constructor.  However, no specification is given what this constructor
should do.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
  <p>In section 24.4.1.3.1 <a href="lib-iterators.html#lib.reverse.iter.cons">[lib.reverse.iter.cons]</a> add the following
  paragraph:</p>
      <blockquote>
      <p>
                <tt>reverse_iterator()</tt>
            </p>

      <p>Default initializes <tt>current</tt>. Iterator operations
      applied to the resulting iterator have defined behavior if and
      only if the corresponding operations are defined on a default
      constructed iterator of type <tt>Iterator</tt>.</p>
      </blockquote>
  <p>
            <i>[pre-Copenhagen: Dietmar provide wording for proposed
  resolution.]</i>
        </p>
<hr>
        <a name="237">
            <h3>237.&nbsp;Undefined expression in complexity specification</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.2.1 <a href="lib-containers.html#lib.list.cons">[lib.list.cons]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;24 Apr 2000</p>
<p>The complexity specification in paragraph 6 says that the complexity
is linear in <tt>first - last</tt>. Even if <tt>operator-()</tt> is
defined on iterators this term is in general undefined because it
would have to be <tt>last - first</tt>.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
  <p>Change paragraph 6 from</p>
     <blockquote>Linear in <i>first - last</i>.</blockquote>
  <p>to become</p>
     <blockquote>Linear in <i>distance(first, last)</i>.</blockquote>
<hr>
        <a name="238">
            <h3>238.&nbsp;Contradictory results of stringbuf initialization.</h3>
        </a>
        <p>
            <b>Section:</b> 27.7.1.1 <a href="lib-iostreams.html#lib.stringbuf.cons">[lib.stringbuf.cons]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dietmar K&uuml;hl <b>Date:</b>&nbsp;11 May 2000</p>
<p>In 27.7.1.1 paragraph 4 the results of calling the constructor of
'basic_stringbuf' are said to be <tt>str() == str</tt>. This is fine
that far but consider this code:</p>

<pre>
  std::basic_stringbuf&lt;char&gt; sbuf("hello, world", std::ios_base::openmode(0));
  std::cout &lt;&lt; "'" &lt;&lt; sbuf.str() &lt;&lt; "'\n";
</pre>

<p>Paragraph 3 of 27.7.1.1 basically says that in this case neither
the output sequence nor the input sequence is initialized and
paragraph 2 of 27.7.1.2 basically says that <tt>str()</tt> either
returns the input or the output sequence. None of them is initialized,
ie. both are empty, in which case the return from <tt>str()</tt> is
defined to be <tt>basic_string&lt;cT&gt;()</tt>.</p>

<p>However, probably only test cases in some testsuites will detect this
"problem"...</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Remove 27.7.1.1 paragraph 4.</p>
<p>
            <b>Rationale:</b>
        </p>
<p>We could fix 27.7.1.1 paragraph 4, but there would be no point.  If
we fixed it, it would say just the same thing as text that's already
in the standard.</p>
<hr>
        <a name="239">
            <h3>239.&nbsp;Complexity of unique() and/or unique_copy incorrect</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.8 <a href="lib-algorithms.html#lib.alg.unique">[lib.alg.unique]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;May 15 2000</p>
<p>The complexity of unique and unique_copy are inconsistent with each
other and inconsistent with the implementations.&nbsp; The standard
specifies:</p>

<p>for unique():</p>

<blockquote>-3- Complexity: If the range (last - first) is not empty, exactly
(last - first) - 1 applications of the corresponding predicate, otherwise
no applications of the predicate.</blockquote>

<p>for unique_copy():</p>

<blockquote>-7- Complexity: Exactly last - first applications of the corresponding
predicate.</blockquote>

<p>
The implementations do it the other way round: unique() applies the
predicate last-first times and unique_copy() applies it last-first-1
times.</p>

<p>As both algorithms use the predicate for pair-wise comparison of
sequence elements I don't see a justification for unique_copy()
applying the predicate last-first times, especially since it is not
specified to which pair in the sequence the predicate is applied
twice.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change both complexity sections in 25.2.8 <a href="lib-algorithms.html#lib.alg.unique">[lib.alg.unique]</a> to:</p>

<blockquote>Complexity: Exactly last - first - 1 applications of the
corresponding predicate.</blockquote>

<p>
            <i>[Toronto: This is related to issue <a href="lwg-active.html#202">202</a>.  We can't
specify <tt>unique</tt>'s complexity until we decide what
<tt>unique</tt> is supposed to do.]</i>
        </p>
<hr>
        <a name="240">
            <h3>240.&nbsp;Complexity of adjacent_find() is meaningless</h3>
        </a>
        <p>
            <b>Section:</b> 25.1.5 <a href="lib-algorithms.html#lib.alg.adjacent.find">[lib.alg.adjacent.find]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;May 15 2000</p>
<p>The complexity section of adjacent_find is defective:</p>

<blockquote>
<pre>
template &lt;class ForwardIterator&gt;
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last
                              BinaryPredicate pred);
</pre>

<p>-1- Returns: The first iterator i such that both i and i + 1 are in
the range [first, last) for which the following corresponding
conditions hold: *i == *(i + 1), pred(*i, *(i + 1)) != false. Returns
last if no such iterator is found.</p>

<p>-2- Complexity: Exactly find(first, last, value) - first applications
of the corresponding predicate.
</p>
</blockquote>

<p>In the Complexity section, it is not defined what "value"
is supposed to mean. My best guess is that "value" means an
object for which one of the conditions pred(*i,value) or
pred(value,*i) is true, where i is the iterator defined in the Returns
section. However, the value type of the input sequence need not be
equality-comparable and for this reason the term find(first, last,
value) - first is meaningless.</p>

<p>A term such as find_if(first, last, bind2nd(pred,*i)) - first or
find_if(first, last, bind1st(pred,*i)) - first might come closer to
the intended specification.  Binders can only be applied to function
objects that have the function call operator declared const, which is
not required of predicates because they can have non-const data
members. For this reason, a specification using a binder could only be
an "as-if" specification.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the complexity section in 25.1.5 <a href="lib-algorithms.html#lib.alg.adjacent.find">[lib.alg.adjacent.find]</a> to:
"For a nonempty range, at most <tt>(last - first) - 1</tt>
comparisons."</p>
<hr>
        <a name="241">
            <h3>241.&nbsp;Does unique_copy() require CopyConstructible and Assignable?</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.8 <a href="lib-algorithms.html#lib.alg.unique">[lib.alg.unique]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;May 15 2000</p>

<p>Some popular implementations of unique_copy() create temporary
copies of values in the input sequence, at least if the input iterator
is a pointer.  Such an implementation is built on the assumption that
the value type is CopyConstructible and Assignable.</p>

<p>It is common practice in the standard that algorithms explicitly
specify any additional requirements that they impose on any of the
types used by the algorithm. An example of an algorithm that creates
temporary copies and correctly specifies the additional requirements
is accumulate(), 26.4.1 <a href="lib-numerics.html#lib.accumulate">[lib.accumulate]</a>.</p>

<p>Since the specifications of unique() and unique_copy() do not
require CopyConstructible and Assignable of the InputIterator's value
type the above mentioned implementations are not standard-compliant. I
cannot judge whether this is a defect in the standard or a defect in
the implementations.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 25.2.8 change:</p>

<blockquote>
-4- Requires: The ranges [first, last) and [result, result+(last-first))
shall not overlap.
</blockquote>

<p>to:</p>

<blockquote>
-4- Requires: The ranges [first, last) and [result, result+(last-first))
shall not overlap. The expression *result = *first is valid.
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>
Creating temporary copies is unavoidable, since the arguments may be
input iterators; this implies that the value type must be copy
constructible.  However, we don't need to say this explicitly; it's
already implied by table 72 in 24.1.1.  We don't precisely want to say
that the input iterator's value type <tt>T</tt> must be assignable,
because we never quite use that property.  We assign through the
output iterator.  The output iterator might have a different value
type, or no value type; it might not use <tt>T</tt>'s assignment
operator.  If it's an <tt>ostream_iterator</tt>, for example, then
we'll use <tt>T</tt>'s operator&lt;&lt; but not its assignment
operator.
</p>
<hr>
        <a name="242">
            <h3>242.&nbsp;Side effects of function objects</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.3 <a href="lib-algorithms.html#lib.alg.transform">[lib.alg.transform]</a>, 26.4 <a href="lib-numerics.html#lib.numeric.ops">[lib.numeric.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;May 15 2000</p>
<p>The algorithms transform(), accumulate(), inner_product(),
partial_sum(), and adjacent_difference() require that the function
object supplied to them shall not have any side effects.</p>

<p>The standard defines a side effect in 1.9 <a href="intro.html#intro.execution">[intro.execution]</a> as:</p>
<blockquote>-7- Accessing an object designated by a volatile lvalue (basic.lval),
modifying an object, calling a library I/O function, or calling a function
that does any of those operations are all side effects, which are changes
in the state of the execution environment.</blockquote>

<p>As a consequence, the function call operator of a function object supplied
to any of the algorithms listed above cannot modify data members, cannot
invoke any function that has a side effect, and cannot even create and
modify temporary objects.&nbsp; It is difficult to imagine a function object
that is still useful under these severe limitations. For instance, any
non-trivial transformator supplied to transform() might involve creation
and modification of temporaries, which is prohibited according to the current
wording of the standard.</p>

<p>On the other hand, popular implementations of these algorithms exhibit
uniform and predictable behavior when invoked with a side-effect-producing
function objects. It looks like the strong requirement is not needed for
efficient implementation of these algorithms.</p>

<p>The requirement of&nbsp; side-effect-free function objects could be
replaced by a more relaxed basic requirement (which would hold for all
function objects supplied to any algorithm in the standard library):</p>
<blockquote>A function objects supplied to an algorithm shall not invalidate
any iterator or sequence that is used by the algorithm. Invalidation of
the sequence includes destruction of the sorting order if the algorithm
relies on the sorting order (see section 25.3 - Sorting and related operations
[lib.alg.sorting]).</blockquote>

<p>I can't judge whether it is intended that the function objects supplied
to transform(), accumulate(), inner_product(), partial_sum(), or adjacent_difference()
shall not modify sequence elements through dereferenced iterators.</p>

<p>It is debatable whether this issue is a defect or a change request.
Since the consequences for user-supplied function objects are drastic and
limit the usefulness of the algorithms significantly I would consider it
a defect.</p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>Things to notice about these changes:</i>
        </p>

<ol>
<li> <i>The fully-closed ("[]" as opposed to half-closed "[)" ranges
     are intentional. we want to prevent side-effects from
     invalidating the end iterators.</i>
            </li>

<li> <i>That has the unintentional side-effect of prohibiting
     modification of the end element as a side-effect. This could
     conceivably be significant in some cases.</i>
            </li>

<li> <i>The wording also prevents side-effects from modifying elements
     of the output sequence. I can't imagine why anyone would want
     to do this, but it is arguably a restriction that implementors
     don't need to place on users.</i>
            </li>

<li> <i>Lifting the restrictions imposed in #2 and #3 above is possible
     and simple, but would require more verbiage.</i>
            </li>
</ol>

<p>Change 25.2.3/2 from:</p>

<blockquote>
   -2- Requires: op and binary_op shall not have any side effects.
</blockquote>

<p>to:</p>

<blockquote>
  -2- Requires: in the ranges [first1, last1], [first2, first2 +
  (last1 - first1)] and [result, result + (last1- first1)], op and
  binary_op shall neither modify elements nor invalidate iterators or
  subranges.
</blockquote>


<p>Change 25.2.3/2 from:</p>

<blockquote>
   -2- Requires: op and binary_op shall not have any side effects. 
</blockquote>

<p>to:</p>

<blockquote>
  -2- Requires: op and binary_op shall not invalidate iterators or
   subranges, or modify elements in the ranges [first1, last1],
   [first2, first2 + (last1 - first1)], and [result, result + (last1
   - first1)].
</blockquote>


<p>Change 26.4.1/2 from:</p>

<blockquote>
  -2- Requires: T must meet the requirements of CopyConstructible
   (lib.copyconstructible) and Assignable (lib.container.requirements)
   types. binary_op shall not cause side effects.
</blockquote>

<p>to:</p>

<blockquote>
  -2- Requires: T must meet the requirements of CopyConstructible
   (lib.copyconstructible) and Assignable
   (lib.container.requirements) types. In the range [first, last],
   binary_op shall neither modify elements nor invalidate iterators
   or subranges.
</blockquote>

<p>Change 26.4.2/2 from:</p>

<blockquote>
  -2- Requires: T must meet the requirements of CopyConstructible
   (lib.copyconstructible) and Assignable (lib.container.requirements)
   types. binary_op1 and binary_op2 shall not cause side effects.
</blockquote>

<p>to:</p>

<blockquote>
  -2- Requires: T must meet the requirements of CopyConstructible
   (lib.copyconstructible) and Assignable (lib.container.requirements)
   types. In the ranges [first, last] and [first2, first2 + (last -
   first)], binary_op1 and binary_op2 shall neither modify elements
   nor invalidate iterators or subranges.
</blockquote>


<p>Change 26.4.3/4 from:</p>

<blockquote>
  -4- Requires: binary_op is expected not to have any side effects.
</blockquote>

<p>to:</p>

<blockquote>
  -4- Requires: In the ranges [first, last] and [result, result +
   (last - first)], binary_op shall neither modify elements nor
   invalidate iterators or subranges.
</blockquote>

<p>Change 26.4.4/2 from:</p>

<blockquote>
  -2- Requires: binary_op shall not have any side effects.
</blockquote>

<p>to:</p>

<blockquote>
  -2- Requires: In the ranges [first, last] and [result, result +
   (last - first)], binary_op shall neither modify elements nor
   invalidate iterators or subranges.
</blockquote>

<p>
            <i>[Toronto: Dave Abrahams supplied wording.]</i>
        </p>
<hr>
        <a name="243">
            <h3>243.&nbsp;<tt>get</tt> and <tt>getline</tt> when sentry reports failure</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.1.3 <a href="lib-iostreams.html#lib.istream.unformatted">[lib.istream.unformatted]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;May 15 2000</p>
<p>basic_istream&lt;&gt;::get(), and basic_istream&lt;&gt;::getline(),
are unclear with respect to the behavior and side-effects of the named
functions in case of an error.</p>

<p>27.6.1.3, p1 states that "... If the sentry object returns
true, when converted to a value of type bool, the function endeavors
to obtain the requested input..." It is not clear from this (or
the rest of the paragraph) what precisely the behavior should be when
the sentry ctor exits by throwing an exception or when the sentry
object returns false.  In particular, what is the number of characters
extracted that gcount() returns supposed to be?</p>

<p>27.6.1.3 p8 and p19 say about the effects of get() and getline():
"...  In any case, it then stores a null character (using
charT()) into the next successive location of the array." Is not
clear whether this sentence applies if either of the conditions above
holds (i.e., when sentry fails).</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add to 27.6.1.3, p1 after the sentence</p>

<blockquote>
"... If the sentry object returns true, when converted to a value of
type bool, the function endeavors to obtain the requested input."
</blockquote>

<p>the following</p>


<blockquote>
"Otherwise, if the sentry constructor exits by throwing an exception or
if the sentry object returns false, when converted to a value of type
bool, the function returns without attempting to obtain any input. In
either case the number of extracted characters is set to 0; unformatted
input functions taking a character array of non-zero size as an argument
shall also store a null character (using charT()) in the first location
of the array."
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>Although the general philosophy of the input functions is that the
argument should not be modified upon failure, <tt>getline</tt>
historically added a terminating null unconditionally.  Most
implementations still do that.  Earlier versions of the draft standard
had language that made this an unambiguous requirement; those words
were moved to a place where their context made them less clear.  See
Jerry Schwarz's message c++std-lib-7618.</p>
<hr>
        <a name="247">
            <h3>247.&nbsp;<tt>vector</tt>, <tt>deque::insert</tt> complexity</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.4.3 <a href="lib-containers.html#lib.vector.modifiers">[lib.vector.modifiers]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Lisa Lippincott <b>Date:</b>&nbsp;06 June 2000</p>
<p>Paragraph 2 of 23.2.4.3 [lib.vector.modifiers] describes the complexity
of <tt>vector::insert</tt>:</p>

   <blockquote>
   Complexity: If first and last are forward iterators, bidirectional
   iterators, or random access iterators, the complexity is linear in
   the number of elements in the range [first, last) plus the distance
   to the end of the vector. If they are input iterators, the complexity
   is proportional to the number of elements in the range [first, last)
   times the distance to the end of the vector.
   </blockquote>

<p>First, this fails to address the non-iterator forms of
<tt>insert</tt>.</p>

<p>Second, the complexity for input iterators misses an edge case --
it requires that an arbitrary number of elements can be added at
the end of a <tt>vector</tt> in constant time.</p>

<p>At the risk of strengthening the requirement, I suggest simply</p>

   <blockquote>
   Complexity: The complexity is linear in the number of elements 
   inserted plus the distance to the end of the vector.
   </blockquote>

<p>For input iterators, one may achieve this complexity by first
inserting at the end of the <tt>vector</tt>, and then using
<tt>rotate</tt>.</p>

<p>I looked to see if <tt>deque</tt> had a similar problem, and was
surprised to find that <tt>deque</tt> places no requirement on the
complexity of inserting multiple elements (23.2.1.3 <a href="lib-containers.html#lib.deque.modifiers">[lib.deque.modifiers]</a>,
paragraph 3):</p>

   <blockquote>
   Complexity: In the worst case, inserting a single element into a
   deque takes time linear in the minimum of the distance from the
   insertion point to the beginning of the deque and the distance
   from the insertion point to the end of the deque. Inserting a
   single element either at the beginning or end of a deque always
   takes constant time and causes a single call to the copy constructor
   of T.
   </blockquote>

<p>I suggest:</p>

   <blockquote>
   Complexity: The complexity is linear in the number of elements 
   inserted plus the shorter of the distances to the beginning and
   end of the deque.  Inserting a single element at either the
   beginning or the end of a deque causes a single call to the copy
   constructor of T.
   </blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[Toronto: It's agreed that there is a defect in complexity of
multi-element insert for vector and deque.  For vector, the complexity
should probably be something along the lines of <tt>c<sub>1</sub> * N
+ c<sub>2</sub> * distance(i, end())</tt>.  However, there is some
concern about whether it is reasonable to amortize away the copies
that we get from a reallocation whenever we exceed the vector's
capacity.  For deque, the situation is somewhat less clear.  Deque is
notoriously complicated, and we may not want to impose complexity
requirements that would imply any implementation technique more
complicated than a while loop whose body is a single-element
insert.]</i>
        </p>
<hr>
        <a name="248">
            <h3>248.&nbsp;time_get fails to set eofbit</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.5 <a href="lib-locales.html#lib.category.time">[lib.category.time]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;22 June 2000</p>
<p>There is no requirement that any of time_get member functions set
ios::eofbit when they reach the end iterator while parsing their input.
Since members of both the num_get and money_get facets are required to
do so (22.2.2.1.2, and 22.2.6.1.2, respectively), time_get members
should follow the same requirement for consistency.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add paragraph 2 to section 22.2.5.1 with the following text:</p>

<blockquote>
If the end iterator is reached during parsing by any of the get()
member functions, the member sets ios_base::eofbit in err.
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>Two alternative resolutions were proposed.  The LWG chose this one
because it was more consistent with the way eof is described for other
input facets.</p>
<hr>
        <a name="250">
            <h3>250.&nbsp;splicing invalidates iterators</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Brian Parker  <b>Date:</b>&nbsp;14 Jul 2000</p>
<p>
Section 23.2.2.4 [lib.list.ops] states that
</p>
<pre>
  void splice(iterator position, list&lt;T, Allocator&gt;&amp; x);
</pre>
<p>
<i>invalidates</i> all iterators and references to list <tt>x</tt>.
</p>

<p>
This is unnecessary and defeats an important feature of splice. In
fact, the SGI STL guarantees that iterators to <tt>x</tt> remain valid
after <tt>splice</tt>.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>Add a footnote to 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>, paragraph 1:</p>
<blockquote>
[<i>Footnote:</i> As specified in 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a>, paragraphs
4-5, the semantics described in this clause applies only to the case
where allocators compare equal.  --end footnote]
</blockquote>

<p>In 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>, replace paragraph 4 with:</p>
<blockquote>
Effects: Inserts the contents of x before position and x becomes 
empty.  Pointers and references to the moved elements of x now refer to 
those same elements but as members of *this.  Iterators referring to the 
moved elements will continue to refer to their elements, but they now 
behave as iterators into *this, not into x.
</blockquote>

<p>In 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>, replace paragraph 7 with:</p>
<blockquote>
Effects: Inserts an element pointed to by i from list x before 
position and removes the element from x. The result is unchanged if 
position == i or position == ++i.  Pointers and references to *i continue 
to refer to this same element but as a member of *this.  Iterators to *i 
(including i itself) continue to refer to the same element, but now 
behave as iterators into *this, not into x.
</blockquote>

<p>In 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>, replace paragraph 12 with:</p>
<blockquote>
Requires: [first, last) is a valid range in x. The result is 
undefined if position is an iterator in the range [first, last).  
Pointers and references to the moved elements of x now refer to those 
same elements but as members of *this.  Iterators referring to the moved 
elements will continue to refer to their elements, but they now behave as 
iterators into *this, not into x.
</blockquote>

<p>
            <i>[pre-Copenhagen: Howard provided wording.]</i>
        </p>
<p>
            <b>Rationale:</b>
        </p>
<p>The original proposed resolution said that iterators and references
would remain "valid".  The new proposed resolution clarifies what that
means.  Note that this only applies to the case of equal allocators.
From 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a> paragraph 4, the behavior of list when
allocators compare nonequal is outside the scope of the standard.</p>
<hr>
        <a name="251">
            <h3>251.&nbsp;basic_stringbuf missing allocator_type</h3>
        </a>
        <p>
            <b>Section:</b> 27.7.1 <a href="lib-iostreams.html#lib.stringbuf">[lib.stringbuf]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;28 Jul 2000</p>
<p>The synopsis for the template class <tt>basic_stringbuf</tt>
doesn't list a typedef for the template parameter
<tt>Allocator</tt>. This makes it impossible to determine the type of
the allocator at compile time. It's also inconsistent with all other
template classes in the library that do provide a typedef for the
<tt>Allocator</tt> parameter.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add to the synopses of the class templates basic_stringbuf (27.7.1),
basic_istringstream (27.7.2), basic_ostringstream (27.7.3), and 
basic_stringstream (27.7.4) the typedef:</p>
<pre>
  typedef Allocator allocator_type;
</pre>
<hr>
        <a name="252">
            <h3>252.&nbsp;missing casts/C-style casts used in iostreams</h3>
        </a>
        <p>
            <b>Section:</b> 27.7 <a href="lib-iostreams.html#lib.string.streams">[lib.string.streams]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;28 Jul 2000</p>
<p>27.7.2.2, p1 uses a C-style cast rather than the more appropriate
const_cast&lt;&gt; in the Returns clause for basic_istringstream&lt;&gt;::rdbuf().
The same C-style cast is being used in 27.7.3.2, p1, D.7.2.2, p1, and
D.7.3.2, p1, and perhaps elsewhere. 27.7.6, p1 and D.7.2.2, p1 are missing
the cast altogether.</p>

<p>C-style casts have not been deprecated, so the first part of this
issue is stylistic rather than a matter of correctness.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 27.7.2.2, p1 replace </p>
<pre>  -1- Returns: (basic_stringbuf&lt;charT,traits,Allocator&gt;*)&amp;sb.</pre>

<p>with</p>
<pre>  -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>


<p>In 27.7.3.2, p1 replace</p>
<pre>  -1- Returns: (basic_stringbuf&lt;charT,traits,Allocator&gt;*)&amp;sb.</pre>

<p>with</p>
<pre>  -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>

<p>In 27.7.6, p1, replace</p>
<pre>  -1- Returns: &amp;sb</pre>

<p>with</p>
<pre>  -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>

<p>In D.7.2.2, p1 replace</p>
<pre>  -2- Returns: &amp;sb. </pre>

<p>with</p>
<pre>  -2- Returns: const_cast&lt;strstreambuf*&gt;(&amp;sb).</pre>
<hr>
        <a name="253">
            <h3>253.&nbsp;valarray helper functions are almost entirely useless</h3>
        </a>
        <p>
            <b>Section:</b> 26.3.2.1 <a href="lib-numerics.html#lib.valarray.cons">[lib.valarray.cons]</a>, 26.3.2.2 <a href="lib-numerics.html#lib.valarray.assign">[lib.valarray.assign]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Robert Klarer <b>Date:</b>&nbsp;31 Jul 2000</p>
<p>This discussion is adapted from message c++std-lib-7056 posted
November 11, 1999.  I don't think that anyone can reasonably claim
that the problem described below is NAD.</p>

<p>These valarray constructors can never be called:</p>

<pre>
   template &lt;class T&gt;
         valarray&lt;T&gt;::valarray(const slice_array&lt;T&gt; &amp;);
   template &lt;class T&gt;
         valarray&lt;T&gt;::valarray(const gslice_array&lt;T&gt; &amp;);
   template &lt;class T&gt;
         valarray&lt;T&gt;::valarray(const mask_array&lt;T&gt; &amp;);
   template &lt;class T&gt;
         valarray&lt;T&gt;::valarray(const indirect_array&lt;T&gt; &amp;);
</pre>

<p>Similarly, these valarray assignment operators cannot be
called:</p>

<pre>
     template &lt;class T&gt;
     valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const slice_array&lt;T&gt; &amp;);
     template &lt;class T&gt;
     valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const gslice_array&lt;T&gt; &amp;);
     template &lt;class T&gt;
     valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const mask_array&lt;T&gt; &amp;);
     template &lt;class T&gt;
     valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const indirect_array&lt;T&gt; &amp;);
</pre>

<p>Please consider the following example:</p>

<pre>
   #include &lt;valarray&gt;
   using namespace std;

   int main()
   {
       valarray&lt;double&gt; va1(12);
       valarray&lt;double&gt; va2(va1[slice(1,4,3)]); // line 1
   }
</pre>


<p>Since the valarray va1 is non-const, the result of the sub-expression
va1[slice(1,4,3)] at line 1 is an rvalue of type const
std::slice_array&lt;double&gt;.  This slice_array rvalue is then used to
construct va2.  The constructor that is used to construct va2 is
declared like this:</p>

<pre>
     template &lt;class T&gt;
     valarray&lt;T&gt;::valarray(const slice_array&lt;T&gt; &amp;);
</pre>

<p>Notice the constructor's const reference parameter.  When the
constructor is called, a slice_array must be bound to this reference.
The rules for binding an rvalue to a const reference are in 8.5.3,
paragraph 5 (see also 13.3.3.1.4).  Specifically, paragraph 5
indicates that a second slice_array rvalue is constructed (in this
case copy-constructed) from the first one; it is this second rvalue
that is bound to the reference parameter.  Paragraph 5 also requires
that the constructor that is used for this purpose be callable,
regardless of whether the second rvalue is elided.  The
copy-constructor in this case is not callable, however, because it is
private.  Therefore, the compiler should report an error.</p>

<p>Since slice_arrays are always rvalues, the valarray constructor that has a
parameter of type const slice_array&lt;T&gt; &amp; can never be called.  The
same reasoning applies to the three other constructors and the four
assignment operators that are listed at the beginning of this post.
Furthermore, since these functions cannot be called, the valarray helper
classes are almost entirely useless.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Adopt section 2 of 00-0023/N1246.  Sections 1 and 5 of that paper have 
already been classified as "Request for Extension".  Sections
3 and 4 are reasonable generalizations of section 2, but they do not
resolve an obvious inconsistency in the standard.
</p>

<p>
            <i>[Toronto: it is agreed that there is a defect.  A full
discussion, and an attempt at fixing the defect, should wait until we
can hear from valarray experts.]</i>
        </p>
<hr>
        <a name="254">
            <h3>254.&nbsp;Exception types in clause 19 are constructed from <tt>std::string</tt>
            </h3>
        </a>
        <p>
            <b>Section:</b> 19.1 <a href="lib-diagnostics.html#lib.std.exceptions">[lib.std.exceptions]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dave Abrahams <b>Date:</b>&nbsp;01 Aug 2000</p>
<p>
Many of the standard exception types which implementations are
required to throw are constructed with a const std::string&amp;
parameter. For example:
</p>

<pre>
     19.1.5  Class out_of_range                          [lib.out.of.range]
     namespace std {
       class out_of_range : public logic_error {
       public:
         explicit out_of_range(const string&amp; what_arg);
       };
     }

   1 The class out_of_range defines the type of objects  thrown  as  excep-
     tions to report an argument value not in its expected range.

     out_of_range(const string&amp; what_arg);

     Effects:
       Constructs an object of class out_of_range.
     Postcondition:
       strcmp(what(), what_arg.c_str()) == 0.
</pre>

<p>
There are at least two problems with this:
</p>
<ol>
<li>A program which is low on memory may end up throwing
std::bad_alloc instead of out_of_range because memory runs out while
constructing the exception object.</li>
<li>An obvious implementation which stores a std::string data member
may end up invoking terminate() during exception unwinding because the
exception object allocates memory (or rather fails to) as it is being
copied.</li>
</ol>

<p>
There may be no cure for (1) other than changing the interface to
out_of_range, though one could reasonably argue that (1) is not a
defect. Personally I don't care that much if out-of-memory is reported
when I only have 20 bytes left, in the case when out_of_range would
have been reported. People who use exception-specifications might care
a lot, though.
</p>

<p>
There is a cure for (2), but it isn't completely obvious. I think a
note for implementors should be made in the standard. Avoiding
possible termination in this case shouldn't be left up to chance.  The
cure is to use a reference-counted "string" implementation
in the exception object. I am not necessarily referring to a
std::string here; any simple reference-counting scheme for a NTBS
would do.
</p>

<p>
Further discussion, in email:
</p>

<p>
...I'm not so concerned about (1). After all, a library implementation
can add const char* constructors as an extension, and users don't
<i>need</i> to avail themselves of the standard exceptions, though this is
a lame position to be forced into.  FWIW, std::exception and
std::bad_alloc don't require a temporary basic_string.
</p>

<p>
...I don't think the fixed-size buffer is a solution to the problem,
strictly speaking, because you can't satisfy the postcondition
<br>
    <tt>&nbsp;&nbsp;strcmp(what(), what_arg.c_str()) == 0</tt>
<br>
For all values of what_arg (i.e. very long values). That means that
the only truly conforming solution requires a dynamic allocation.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[Toronto: some LWG members thought this was merely a QoI issue,
but most believed that it was at least a borderline defect.  There was
more support for nonnormative advice to implementors than for a
normative change.]</i>
        </p>
<hr>
        <a name="256">
            <h3>256.&nbsp;typo in 27.4.4.2, p17: copy_event does not exist</h3>
        </a>
        <p>
            <b>Section:</b> 27.4.4.2 <a href="lib-iostreams.html#lib.basic.ios.members">[lib.basic.ios.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;21 Aug 2000</p>
<p>
27.4.4.2, p17 says
</p>

<blockquote>
-17- Before copying any parts of rhs, calls each registered callback
pair (fn,index) as (*fn)(erase_event,*this,index). After all parts but
exceptions() have been replaced, calls each callback pair that was
copied from rhs as (*fn)(copy_event,*this,index). 
</blockquote>

<p>
The name copy_event isn't defined anywhere. The intended name was
copyfmt_event.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace copy_event with copyfmt_event in the named paragraph.</p>
<hr>
        <a name="258">
            <h3>258.&nbsp;Missing allocator requirement</h3>
        </a>
        <p>
            <b>Section:</b> 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;22 Aug 2000</p>
<p>
From lib-7752:
</p>

<p>
I've been assuming (and probably everyone else has been assuming) that
allocator instances have a particular property, and I don't think that
property can be deduced from anything in Table 32.
</p>

<p>
I think we have to assume that allocator type conversion is a
homomorphism.  That is, if x1 and x2 are of type X, where
X::value_type is T, and if type Y is X::template
rebind&lt;U&gt;::other, then Y(x1) == Y(x2) if and only if x1 == x2.
</p>

<p>
Further discussion: Howard Hinnant writes, in lib-7757:
</p>

<p>
I think I can prove that this is not provable by Table 32.  And I agree 
it needs to be true except for the "and only if".  If x1 != x2, I see no 
reason why it can't be true that Y(x1) == Y(x2).  Admittedly I can't 
think of a practical instance where this would happen, or be valuable.  
But I also don't see a need to add that extra restriction.  I think we 
only need:
</p>

<blockquote>
     if (x1 == x2) then Y(x1) == Y(x2)
</blockquote>

<p>
If we decide that == on allocators is transitive, then I think I can 
prove the above.  But I don't think == is necessarily transitive on 
allocators.  That is:
</p>

<p>
Given x1 == x2  and x2 == x3, this does not mean x1 == x3.
</p>

<p>Example:</p>

<blockquote>
<p>
x1 can deallocate pointers from:  x1, x2, x3    <br>
x2 can deallocate pointers from:  x1, x2, x4    <br>
x3 can deallocate pointers from:  x1, x3        <br>
x4 can deallocate pointers from:  x2, x4 
</p>

<p>
x1 == x2, and x2 == x4, but x1 != x4
</p>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>
            <i>[Toronto: LWG members offered multiple opinions.  One
opinion is that it should not be required that <tt>x1 == x2</tt>
implies <tt>Y(x1) == Y(x2)</tt>, and that it should not even be
required that <tt>X(x1) == x1</tt>.  Another opinion is that 
the second line from the bottom in table 32 already implies the
desired property.  This issue should be considered in light of
other issues related to allocator instances.]</i>
        </p>
<hr>
        <a name="259">
            <h3>259.&nbsp;<tt>basic_string::operator[]</tt> and const correctness</h3>
        </a>
        <p>
            <b>Section:</b> 21.3.4 <a href="lib-strings.html#lib.string.access">[lib.string.access]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Chris Newton  <b>Date:</b>&nbsp;27 Aug 2000</p>
<p>
<i>Paraphrased from a message that Chris Newton posted to comp.std.c++:</i>
</p>

<p>
The standard's description of <tt>basic_string&lt;&gt;::operator[]</tt>
seems to violate const correctness.
</p>

<p>
The standard (21.3.4/1) says that "If <tt>pos &lt; size()</tt>,
returns <tt>data()[pos]</tt>." The types don't work.  The
return value of <tt>data()</tt> is <tt>const charT*</tt>, but
<tt>operator[]</tt> has a non-const version whose return type is <tt>reference</tt>.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In section 21.3.4, paragraph 1, change
"<tt>data()[<i>pos</i>]</tt>" to "<tt>*(begin() +
<i>pos</i>)</tt>".
</p>
<hr>
        <a name="260">
            <h3>260.&nbsp;Inconsistent return type of <tt>istream_iterator::operator++(int)</tt>
            </h3>
        </a>
        <p>
            <b>Section:</b> 24.5.1.2 <a href="lib-iterators.html#lib.istream.iterator.ops">[lib.istream.iterator.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;27 Aug 2000</p>
<p>The synopsis of istream_iterator::operator++(int) in 24.5.1 shows
it as returning the iterator by value. 24.5.1.2, p5 shows the same
operator as returning the iterator by reference. That's incorrect
given the Effects clause below (since a temporary is returned). The
`&amp;' is probably just a typo.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the declaration in 24.5.1.2, p5 from</p>
 <pre>
 istream_iterator&lt;T,charT,traits,Distance&gt;&amp; operator++(int);
 </pre>
<p>to</p>
 <pre>
 istream_iterator&lt;T,charT,traits,Distance&gt; operator++(int);
 </pre>
<p>(that is, remove the `&amp;').</p>
<hr>
        <a name="261">
            <h3>261.&nbsp;Missing description of <tt>istream_iterator::operator!=</tt>
            </h3>
        </a>
        <p>
            <b>Section:</b> 24.5.1.2 <a href="lib-iterators.html#lib.istream.iterator.ops">[lib.istream.iterator.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;27 Aug 2000</p>
<p>
24.5.1, p3 lists the synopsis for
</p>

<pre>
   template &lt;class T, class charT, class traits, class Distance&gt;
        bool operator!=(const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; x,
                        const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; y);
</pre>

<p>
but there is no description of what the operator does (i.e., no Effects
or Returns clause) in 24.5.1.2.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Add paragraph 7 to the end of section 24.5.1.2 with the following text:
</p>

<pre>
   template &lt;class T, class charT, class traits, class Distance&gt;
        bool operator!=(const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; x,
                        const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; y);
</pre>

<p>-7- Returns: !(x == y).</p>
<hr>
        <a name="262">
            <h3>262.&nbsp;Bitmask operator ~ specified incorrectly</h3>
        </a>
        <p>
            <b>Section:</b> 17.3.2.1.2 <a href="lib-intro.html#lib.bitmask.types">[lib.bitmask.types]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Beman Dawes <b>Date:</b>&nbsp;03 Sep 2000</p>
<p>
The ~ operation should be applied after the cast to int_type.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Change 17.3.2.1.2 [lib.bitmask.types] operator~ from:
</p>

<pre>
   bitmask operator~ ( bitmask X )
     { return static_cast&lt; bitmask&gt;(static_cast&lt;int_type&gt;(~ X)); }
</pre>

<p>
to:
</p>

<pre>
   bitmask operator~ ( bitmask X )
     { return static_cast&lt; bitmask&gt;(~static_cast&lt;int_type&gt;(X)); }
</pre>
<hr>
        <a name="263">
            <h3>263.&nbsp;Severe restriction on <tt>basic_string</tt> reference counting</h3>
        </a>
        <p>
            <b>Section:</b> 21.3 <a href="lib-strings.html#lib.basic.string">[lib.basic.string]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Kevlin Henney <b>Date:</b>&nbsp;04 Sep 2000</p>
<p>
The note in paragraph 6 suggests that the invalidation rules for
references, pointers, and iterators in paragraph 5 permit a reference-
counted implementation (actually, according to paragraph 6, they permit
a "reference counted implementation", but this is a minor editorial fix).
</p>

<p>
However, the last sub-bullet is so worded as to make a reference-counted
implementation unviable. In the following example none of the
conditions for iterator invalidation are satisfied:
</p>

<pre>
    // first example: "*******************" should be printed twice
    string original = "some arbitrary text", copy = original;
    const string &amp; alias = original;

    string::const_iterator i = alias.begin(), e = alias.end();
    for(string::iterator j = original.begin(); j != original.end(); ++j)
        *j = '*';
    while(i != e)
        cout &lt;&lt; *i++;
    cout &lt;&lt; endl;
    cout &lt;&lt; original &lt;&lt; endl;
</pre>

<p>
Similarly, in the following example:
</p>

<pre>
    // second example: "some arbitrary text" should be printed out
    string original = "some arbitrary text", copy = original;
    const string &amp; alias = original;

    string::const_iterator i = alias.begin();
    original.begin();
    while(i != alias.end())
        cout &lt;&lt; *i++;
</pre>

<p>
I have tested this on three string implementations, two of which were
reference counted. The reference-counted implementations gave
"surprising behavior" because they invalidated iterators on
the first call to non-const begin since construction. The current
wording does not permit such invalidation because it does not take
into account the first call since construction, only the first call
since various member and non-member function calls.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Change the following sentence in 21.3 paragraph 5 from
</p>

<blockquote>
    Subsequent to any of the above uses except the forms of insert() and
    erase() which return iterators, the first call to non-const member
    functions operator[](), at(), begin(), rbegin(), end(), or rend().
</blockquote>

<p>to</p>

<blockquote>
    Following construction or any of the above uses, except the forms of
    insert() and erase() which return iterators, the first call to non-
    const member functions operator[](), at(), begin(), rbegin(), end(),
    or rend().
</blockquote>
<hr>
        <a name="264">
            <h3>264.&nbsp;Associative container <tt>insert(i, j)</tt> complexity requirements are not feasible.</h3>
        </a>
        <p>
            <b>Section:</b> 23.1.2 <a href="lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;John Potter <b>Date:</b>&nbsp;07 Sep 2000</p>
<p>
Table 69 requires linear time if [i, j) is sorted.  Sorted is necessary but not sufficient.
Consider inserting a sorted range of even integers into a set&lt;int&gt; containing the odd
integers in the same range.
</p>

<p>
            <i>Related issue: <a href="lwg-closed.html#102">102</a></i>
        </p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In Table 69, in section 23.1.2, change the complexity clause for
insertion of a range from "N log(size() + N) (N is the distance
from i to j) in general; linear if [i, j) is sorted according to
value_comp()" to "N log(size() + N, where N is the distance
from i to j".
</p>
<p>
            <b>Rationale:</b>
        </p>
<p>
Testing for valid insertions could be less efficient than simply
inserting the elements when the range is not both sorted and between
two adjacent existing elements; this could be a QOI issue.
</p>

<p> 
The LWG considered two other options: (a) specifying that the
complexity was linear if [i, j) is sorted according to value_comp()
and between two adjacent existing elements; or (b) changing to
Klog(size() + N) + (N - K) (N is the distance from i to j and K is the
number of elements which do not insert immediately after the previous
element from [i, j) including the first).  The LWG felt that, since
we can't guarantee linear time complexity whenever the range to be
inserted is sorted, it's more trouble than it's worth to say that it's
linear in some special cases.
</p>
<hr>
        <a name="265">
            <h3>265.&nbsp;std::pair::pair() effects overly restrictive</h3>
        </a>
        <p>
            <b>Section:</b> 20.2.2 <a href="lib-utilities.html#lib.pairs">[lib.pairs]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;11 Sep 2000</p>
<p>
I don't see any requirements on the types of the elements of the
std::pair container in 20.2.2. From the descriptions of the member
functions it appears that they must at least satisfy the requirements of
20.1.3 [lib.copyconstructible] and 20.1.4 [lib.default.con.req], and in
the case of the [in]equality operators also the requirements of 20.1.1
[lib.equalitycomparable] and 20.1.2 [lib.lessthancomparable].
</p>

<p>
I believe that the the CopyConstructible requirement is unnecessary in
the case of 20.2.2, p2.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the Effects clause in 20.2.2, p2 from</p>

<blockquote>
-2- <b>Effects</b>: Initializes its members as if implemented: <tt> pair() :
first(T1()), second(T2()) {} </tt>
</blockquote>

<p>to</p>

<blockquote>
-2- <b>Effects</b>: Initializes its members as if implemented: <tt> pair() :
first(), second() {} </tt>
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>The existing specification of pair's constructor appears to be a
historical artifact: there was concern that pair's members be properly
zero-initialized when they are built-in types.  At one time there was
uncertainty about whether they would be zero-initialized if the
default constructor was written the obvious way.  The core language
was clarified some time ago, however, and there is no longer any doubt
that the straightforward implementation is correct.</p>
<hr>
        <a name="266">
            <h3>266.&nbsp;bad_exception::~bad_exception() missing Effects clause</h3>
        </a>
        <p>
            <b>Section:</b> 18.6.2.1 <a href="lib-support.html#lib.bad.exception">[lib.bad.exception]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;24 Sep 2000</p>
<p>
The synopsis for std::bad_exception lists the function ~bad_exception()
but there is no description of what the function does (the Effects
clause is missing).
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Remove the destructor from the class synopses of 
<tt>bad_alloc</tt> (18.4.2.1 <a href="lib-support.html#lib.bad.alloc">[lib.bad.alloc]</a>),
<tt>bad_cast</tt> (18.5.2 <a href="lib-support.html#lib.bad.cast">[lib.bad.cast]</a>),
<tt>bad_typeid</tt> (18.5.3 <a href="lib-support.html#lib.bad.typeid">[lib.bad.typeid]</a>),
and <tt>bad_exception</tt> (18.6.2.1 <a href="lib-support.html#lib.bad.exception">[lib.bad.exception]</a>).
</p>
<p>
            <b>Rationale:</b>
        </p>
<p>
This is a general problem with the exception classes in clause 18. 
The proposed resolution is to remove the destructors from the class
synopses, rather than to document the destructors' behavior, because
removing them is more consistent with how exception classes are
described in clause 19.
</p>
<hr>
        <a name="267">
            <h3>267.&nbsp;interaction of strstreambuf::overflow() and seekoff()</h3>
        </a>
        <p>
            <b>Section:</b> D.7.1.3 <a href="future.html#depr.strstreambuf.virtuals">[depr.strstreambuf.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Review">Review</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;5 Oct 2000</p>
<p>
It appears that the interaction of the strstreambuf members overflow()
and seekoff() can lead to undefined behavior in cases where defined
behavior could reasonably be expected. The following program
demonstrates this behavior:
</p>

<pre>
    #include &lt;strstream&gt;

    int main ()
    {
         std::strstreambuf sb;
         sb.sputc ('c');

         sb.pubseekoff (-1, std::ios::end, std::ios::in);
         return !('c' == sb.sgetc ());
    }
</pre>

<p>
D.7.1.1, p1 initializes strstreambuf with a call to basic_streambuf&lt;&gt;(),
which in turn sets all pointers to 0 in 27.5.2.1, p1.
</p>
 
<p>
27.5.2.2.5, p1 says that basic_streambuf&lt;&gt;::sputc(c) calls
overflow(traits::to_int_type(c)) if a write position isn't available (it
isn't due to the above).
</p>

<p>
D.7.1.3, p3 says that strstreambuf::overflow(off, ..., ios::in) makes at
least one write position available (i.e., it allows the function to make
any positive number of write positions available).
</p>

<p>
D.7.1.3, p13 computes newoff = seekhigh - eback(). In D.7.1, p4 we see
seekhigh = epptr() ? epptr() : egptr(), or seekhigh = epptr() in this
case. newoff is then epptr() - eback().
</p>

<p>
D.7.1.4, p14 sets gptr() so that gptr() == eback() + newoff + off, or
gptr() == epptr() + off holds.
</p>

<p>
If strstreambuf::overflow() made exactly one write position available
then gptr() will be set to just before epptr(), and the program will
return 0. Buf if the function made more than one write position
available, epptr() and gptr() will both point past pptr() and the
behavior of the program is undefined.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>


   <p>Change the last sentence of 4.7.1 paragraph 4 from</p>

      <blockquote>
      Otherwise, seeklow equals gbeg and seekhigh is either pend, if
      pend is not a null pointer, or gend.
      </blockquote>

   <p>to become</p>

      <blockquote>
      Otherwise, seeklow equals gbeg and seekhigh is either gend if
      0 == pptr() or pbase() + max where max is the maximum value of
      pptr() - pbase() ever reached for this stream.
      </blockquote>

<p>
            <i>[
  pre-Copenhagen: Dietmar provided wording for proposed resolution.
]</i>
        </p>
<p>
            <b>Rationale:</b>
        </p>
<p>Note that this proposed resolution does not require an increase in
the layout of strstreambuf to maintain max: If overflow() is
implemented to make exactly one write position available, max ==
epptr() - pbase() always holds. However, if overflow() makes more than
one write position available, the number of additional character (or
some equivalent) has to be stored somewhere.</p>
<hr>
        <a name="268">
            <h3>268.&nbsp;Typo in locale synopsis</h3>
        </a>
        <p>
            <b>Section:</b> 22.1.1 <a href="lib-locales.html#lib.locale">[lib.locale]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Ready">Ready</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;5 Oct 2000</p>
<p>The synopsis of the class std::locale in 22.1.1 contains two typos:
the semicolons after the declarations of the default ctor
locale::locale() and the copy ctor locale::locale(const locale&amp;)
are missing.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add the missing semicolons, i.e., change</p>

<pre>
    //  construct/copy/destroy:
        locale() throw()
        locale(const locale&amp; other) throw()
</pre>

<p>in the synopsis in 22.1.1 to</p>

<pre>
    //  construct/copy/destroy:
        locale() throw();
        locale(const locale&amp; other) throw();
</pre>
<hr>
        <a name="270">
            <h3>270.&nbsp;Binary search requirements overly strict</h3>
        </a>
        <p>
            <b>Section:</b> 25.3.3 <a href="lib-algorithms.html#lib.alg.binary.search">[lib.alg.binary.search]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#Open">Open</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;18 Oct 2000</p>
<p>
Each of the four binary search algorithms (lower_bound, upper_bound,
equal_range, binary_search) has a form that allows the user to pass a
comparison function object.  According to 25.3, paragraph 2, that
comparison function object has to be a strict weak ordering.
</p>

<p>
This requirement is slightly too strict.  Suppose we are searching
through a sequence containing objects of type X, where X is some
large record with an integer key.  We might reasonably want to look
up a record by key, in which case we would want to write something
like this:
</p>
<pre>
    struct key_comp {
      bool operator()(const X&amp; x, int n) const {
        return x.key() &lt; n;
      }
    }

    std::lower_bound(first, last, 47, key_comp());
</pre>

<p>
key_comp is not a strict weak ordering, but there is no reason to
prohibit its use in lower_bound.
</p>

<p>
There's no difficulty in implementing lower_bound so that it allows
the use of something like key_comp.  (It will probably work unless an
implementor takes special pains to forbid it.)  What's difficult is
formulating language in the standard to specify what kind of
comparison function is acceptable.  We need a notion that's slightly
more general than that of a strict weak ordering, one that can encompass
a comparison function that involves different types.  Expressing that
notion may be complicated.
</p>

<p>
Here is a first attempt: the comparison function comp must be
equivalent to a comparison function of the form C(pi(x), y), and
[first, last) must be sorted in ascending order by the comparison
function C(pi(x), pi(y)), where U is a synonym for
iterator_traits&lt;ForwardIterator&gt;::value_type, x is a value of
type U, y is a value of type T, C is a strict weak ordering whose value
type is T, and pi is a homomorphism from U to T.
</p>

<p>
In this notation, the existing language refers to the special case where
T and U are the same type and where pi is the identity function.
</p>

<p>
            <i>Additional questions raised at the Toronto meeting:</i>
        </p>
<ul>
<li> Do we really want to specify what ordering the implementor must
     use when calling the function object?  The standard gives 
     specific expressions when describing these algorithms, but it also
     says that other expressions (with different argument order) are
     equivalent.</li>
<li> If we are specifying ordering, note that the standard uses both
     orderings when describing <tt>equal_range</tt>.</li>
<li> Are we talking about requiring these algorithms to work properly
     when passed a binary function object whose two argument types
     are not the same, or are we talking about requirements when
     they are passed a binary function object with several overloaded
     versions of <tt>operator()</tt>?</li>
<li> The definition of a strict weak ordering does not appear to give
     any guidance on issues of overloading; it only discusses expressions,
     and all of the values in these expressions are of the same type.
     Some clarification would seem to be in order.</li>
</ul>

<p>
            <b>Proposed resolution:</b>
        </p>

<p>Change 25.3 [lib.alg.sorting] paragraph 3 from:</p>

<blockquote>
  3 For all algorithms that take Compare, there is a version that uses
  operator&lt; instead. That is, comp(*i, *j) != false defaults to *i &lt;
  *j != false. For the algorithms to work correctly, comp has to
  induce a strict weak ordering on the values.
</blockquote>

<p>to:</p>

<blockquote>
  3 For all algorithms that take Compare, there is a version that uses
  operator&lt; instead. That is, comp(*i, *j) != false defaults to *i &lt;
  *j != false. For algorithms not described in lib.alg.binary.search
  (25.3.3) to work correctly, comp has to induce a strict weak
  ordering on the values.
</blockquote>

<p>Add the following paragraph after 25.3 [lib.alg.sorting] paragraph 5:</p>

<blockquote>
  -6- A sequence [start, finish) is partitioned with respect to an
  expression f(e) if there exists a non-negative integer n such that
  for all 0 &lt;= i &lt; distance(start, finish), f(*(begin+i)) is true if
  and only if i &lt; n.
</blockquote>

<p>Change 25.3.3 [lib.alg.binary.search] paragraph 1 from:</p>

<blockquote>
  -1- All of the algorithms in this section are versions of binary
   search and assume that the sequence being searched is in order
   according to the implied or explicit comparison function. They work
   on non-random access iterators minimizing the number of
   comparisons, which will be logarithmic for all types of
   iterators. They are especially appropriate for random access
   iterators, because these algorithms do a logarithmic number of
   steps through the data structure. For non-random access iterators
   they execute a linear number of steps.
</blockquote>

<p>to:</p>

<blockquote>
   -1- All of the algorithms in this section are versions of binary
    search and assume that the sequence being searched is partitioned
    with respect to an expression formed by binding the search key to
    an argument of the implied or explicit comparison function. They
    work on non-random access iterators minimizing the number of
    comparisons, which will be logarithmic for all types of
    iterators. They are especially appropriate for random access
    iterators, because these algorithms do a logarithmic number of
    steps through the data structure. For non-random access iterators
    they execute a linear number of steps.
</blockquote>

<p>Change 25.3.3.1 [lib.lower.bound] paragraph 1 from:</p>

<blockquote>
   -1- Requires: Type T is LessThanComparable
    (lib.lessthancomparable). 
</blockquote>

<p>to:</p>

<blockquote>
   -1- Requires: The elements e of [first, last) are partitioned with
   respect to the expression e &lt; value or comp(e, value)
</blockquote>


<p>Remove 25.3.3.1 [lib.lower.bound] paragraph 2:</p>

<blockquote>
   -2- Effects: Finds the first position into which value can be
    inserted without violating the ordering. 
</blockquote>

<p>Change 25.3.3.2 [lib.upper.bound] paragraph 1 from:</p>

<blockquote>
  -1- Requires: Type T is LessThanComparable (lib.lessthancomparable).
</blockquote>

<p>to:</p>

<blockquote>
   -1- Requires: The elements e of [first, last) are partitioned with
   respect to the expression !(value &lt; e) or !comp(value, e)
</blockquote>

<p>Remove 25.3.3.2 [lib.upper.bound] paragraph 2:</p>

<blockquote>
   -2- Effects: Finds the furthermost position into which value can be
    inserted without violating the ordering.
</blockquote>

<p>Change 25.3.3.3 [lib.equal.range] paragraph 1 from:</p>

<blockquote>
   -1- Requires: Type T is LessThanComparable
    (lib.lessthancomparable).
</blockquote>

<p>to:</p>

<blockquote>
   -1- Requires: The elements e of [first, last) are partitioned with
   respect to the expressions e &lt; value and !(value &lt; e) or 
   comp(e, value) and !comp(value, e).
</blockquote>

<p>
Optionally add the following to the end of the proposed text above,
which allows library implementors to make a small optimization at the
cost of slightly complexifying the standard text. The idea is that we
want to ensure that the partition point which defines the upper_bound
is no earlier in the sequence than the partion point which defines the
lower_bound, so that the implementor can do one of the searches over a
subrange:
</p>

<blockquote>
   Also, for all elements e of [first, last), e &lt; value implies
   !(value &lt; e) or comp(e, value) implies !comp(value, e)
</blockquote>

<p>Note also that if we don't add the above, the result of
equal_range() might be an invalid range.</p>


<p>Change 25.3.3.3 [lib.equal.range] paragraph 2 from:</p>

<blockquote>
   -2- Effects: Finds the largest subrange [i, j) such that the value
    can be inserted at any iterator k in it without violating the
    ordering. k satisfies the corresponding conditions: !(*k &lt; value)
    &amp;&amp; !(value &lt; *k) or comp(*k, value) == false &amp;&amp; comp(value, *k) ==
    false.
</blockquote>

<p>to:</p>

<pre>
   -2- Returns: 
         make_pair(lower_bound(first, last, value),
                   upper_bound(first, last, value))
       or
         make_pair(lower_bound(first, last, value, comp),
                   upper_bound(first, last, value, comp))
</pre>

<p>
Note that the original text did not say whether the first element of
the return value was the beginning or end of the range, or something
else altogether. The proposed text is both more precise and general
enough to accomodate heterogeneous comparisons.
</p>

<p>Change 25.3.3.3 [lib.binary.search] paragraph 1 from:</p>

<blockquote>
   -1- Requires: Type T is LessThanComparable
    (lib.lessthancomparable).
</blockquote>

<p>to:</p>

<blockquote>
   -1- Requires: The elements e of [first, last) are partitioned with
   respect to the expressions e &lt; value and !(value &lt; e) or comp(e,
   value) and !comp(value, e). Also, for all elements e of [first,
   last), e &lt; value implies !(value &lt; e) or comp(e, value) implies
   !comp(value, e)
</blockquote>

<p>
            <i>[Dave Abrahams provided this wording]</i>
        </p>

<hr>
        <a name="271">
            <h3>271.&nbsp;basic_iostream missing typedefs</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.1.5 <a href="lib-iostreams.html#lib.iostreamclass">[lib.iostreamclass]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;02 Nov 2000</p>
<p>
Class template basic_iostream has no typedefs.  The typedefs it
inherits from its base classes can't be used, since (for example)
basic_iostream&lt;T&gt;::traits_type is ambiguous.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>Add the following to basic_iostream's class synopsis in 
27.6.1.5 <a href="lib-iostreams.html#lib.iostreamclass">[lib.iostreamclass]</a>, immediately after <tt>public</tt>:</p>

<pre>
  // types:
  typedef charT                     char_type;
  typedef typename traits::int_type int_type;
  typedef typename traits::pos_type pos_type;
  typedef typename traits::off_type off_type;
  typedef traits                    traits_type;
</pre>
<hr>
        <a name="272">
            <h3>272.&nbsp;Missing parentheses around subexpression</h3>
        </a>
        <p>
            <b>Section:</b> 27.4.4.3 <a href="lib-iostreams.html#lib.iostate.flags">[lib.iostate.flags]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;02 Nov 2000</p>
<p>
27.4.4.3, p4 says about the postcondition of the function: If
rdbuf()!=0 then state == rdstate(); otherwise
rdstate()==state|ios_base::badbit.
</p>

<p>
The expression on the right-hand-side of the operator==() needs to be
parenthesized in order for the whole expression to ever evaluate to
anything but non-zero.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Add parentheses like so: rdstate()==(state|ios_base::badbit).
</p>
<hr>
        <a name="273">
            <h3>273.&nbsp;Missing ios_base qualification on members of a dependent class</h3>
        </a>
        <p>
            <b>Section:</b> 27 <a href="lib-iostreams.html#lib.input.output">[lib.input.output]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;02 Nov 2000</p>
<p>27.5.2.4.2, p4, and 27.8.1.6, p2, 27.8.1.7, p3, 27.8.1.9, p2,
27.8.1.10, p3 refer to in and/or out w/o ios_base:: qualification.
That's incorrect since the names are members of a dependent base
class (14.6.2 [temp.dep]) and thus not visible.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Qualify the names with the name of the class of which they are
members, i.e., ios_base.</p>
<hr>
        <a name="274">
            <h3>274.&nbsp;a missing/impossible allocator requirement</h3>
        </a>
        <p>
            <b>Section:</b> 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;02 Nov 2000</p>
<p>
I see that table 31 in 20.1.5, p3 allows T in std::allocator&lt;T&gt; to be of
any type. But the synopsis in 20.4.1 calls for allocator&lt;&gt;::address() to
be overloaded on reference and const_reference, which is ill-formed for
all T = const U. In other words, this won't work:
</p>

<p>
template class std::allocator&lt;const int&gt;;
</p>

<p>
The obvious solution is to disallow specializations of allocators on
const types. However, while containers' elements are required to be
assignable (which rules out specializations on const T's), I think that
allocators might perhaps be potentially useful for const values in other
contexts. So if allocators are to allow const types a partial
specialization of std::allocator&lt;const T&gt; would probably have to be
provided.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
            <b>Proposed resolution 1</b>
        </p>

<p>
Add the following definition of a partial specialization immediately
below the definition of the primary template in 20.4.1:
</p>

<pre>
    template &lt;class T&gt;
    class allocator&lt;const T&gt; {
    public:
        typedef size_t    size_type;
        typedef ptrdiff_t difference_type;
        typedef const T*  pointer;
        typedef const T*  const_pointer;
        typedef const T&amp;  reference;
        typedef const T&amp;  const_reference;
        typedef const T   value_type;

        template &lt;class U&gt; struct rebind { typedef allocator&lt;U&gt; other; };

        allocator() throw();
        allocator(const allocator&amp;) throw();
        template &lt;class U&gt; allocator(const allocator&lt;U&gt;&amp;) throw();
        ~allocator() throw();

        const_pointer address(const_reference x) const;

        const_pointer allocate(size_type, allocator&lt;void&gt;::const_pointer hint = 0);
        void deallocate(const_pointer p, size_type n);

        size_type max_size() const throw();

        void construct(const_pointer p, const_reference val);
        void destroy(const_pointer p);
    };
</pre>

<p>
            <b>Proposed resolution 2</b>
        </p>

<p>Change the text in row 1, column 2 of table 32 in 20.1.5, p3 from</p>

    <blockquote>
    any type
    </blockquote>

<p>to</p>

    <blockquote>
    any non-const type
    </blockquote>
<hr>
        <a name="275">
            <h3>275.&nbsp;Wrong type in num_get::get() overloads</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.2.1.1 <a href="lib-locales.html#lib.facet.num.get.members">[lib.facet.num.get.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;02 Nov 2000</p>
<p>
In 22.2.2.1.1, we have a list of overloads for num_get&lt;&gt;::get().
There are eight overloads, all of which are identical except for the
last parameter.  The overloads are: 
</p>
<ul>
<li> long&amp; </li>
<li> unsigned short&amp; </li>
<li> unsigned int&amp; </li>
<li> unsigned long&amp; </li>
<li> short&amp; </li>
<li> double&amp; </li>
<li> long double&amp; </li>
<li> void*&amp; </li>
</ul>

<p>
There is a similar list, in 22.2.2.1.2, of overloads for
num_get&lt;&gt;::do_get().  In this list, the last parameter has
the types: 
</p>
<ul>
<li> long&amp; </li>
<li> unsigned short&amp; </li>
<li> unsigned int&amp; </li>
<li> unsigned long&amp; </li>
<li> float&amp; </li>
<li> double&amp; </li>
<li> long double&amp; </li>
<li> void*&amp; </li>
</ul>

<p>
These two lists are not identical.  They should be, since
<tt>get</tt> is supposed to call <tt>do_get</tt> with exactly
the arguments it was given.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In 22.2.2.1.1 <a href="lib-locales.html#lib.facet.num.get.members">[lib.facet.num.get.members]</a>, change</p>
<pre>
  iter_type get(iter_type in, iter_type end, ios_base&amp; str,
                ios_base::iostate&amp; err, short&amp; val) const;
</pre>
<p>to</p>
<pre>
  iter_type get(iter_type in, iter_type end, ios_base&amp; str,
                ios_base::iostate&amp; err, float&amp; val) const;
</pre>
<hr>
        <a name="276">
            <h3>276.&nbsp;Assignable requirement for container value type overly strict</h3>
        </a>
        <p>
            <b>Section:</b> 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Peter Dimov <b>Date:</b>&nbsp;07 Nov 2000</p>
<p>
23.1/3 states that the objects stored in a container must be
Assignable.  23.3.1 <a href="lib-containers.html#lib.map">[lib.map]</a>, paragraph 2,
states that map satisfies all requirements for a container, while in
the same time defining value_type as pair&lt;const Key, T&gt; - a type
that is not Assignable.
</p>

<p>
It should be noted that there exists a valid and non-contradictory
interpretation of the current text. The wording in 23.1/3 avoids 
mentioning value_type, referring instead to "objects stored in a
container." One might argue that map does not store objects of
type map::value_type, but of map::mapped_type instead, and that the
Assignable requirement applies to map::mapped_type, not
map::value_type.
</p>

<p>
However, this makes map a special case (other containers store objects of
type value_type) and the Assignable requirement is needlessly restrictive in
general.
</p>

<p>
For example, the proposed resolution of active library issue 
<a href="lwg-active.html#103">103</a> is to make set::iterator a constant iterator; this
means that no set operations can exploit the fact that the stored
objects are Assignable.
</p>

<p>
This is related to, but slightly broader than, closed issue
<a href="lwg-closed.html#140">140</a>.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Remove the requirement that the objects stored in a container be Assignable
from 23.1/3 and reintroduce it on a case by case basis (for vector and
deque.)
</p>
<p>
            <b>Rationale:</b>
        </p>
<p>list, set, multiset, map, multimap are able to store non-Assignables.</p>
<hr>
        <a name="277">
            <h3>277.&nbsp;Normative encouragement in allocator requirements unclear</h3>
        </a>
        <p>
            <b>Section:</b> 20.1.5 <a href="lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;07 Nov 2000</p>
<p>
In 20.1.5, paragraph 5, the standard says that "Implementors are
encouraged to supply libraries that can accept allocators that
encapsulate more general memory models and that support non-equal
instances." This is intended as normative encouragement to
standard library implementors.  However, it is possible to interpret
this sentence as applying to nonstandard third-party libraries.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In 20.1.5, paragraph 5, change "Implementors" to
"Implementors of the library described in this International
Standard".
</p>
<hr>
        <a name="278">
            <h3>278.&nbsp;What does iterator validity mean?</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;P.J. Plauger <b>Date:</b>&nbsp;27 Nov 2000</p>
<p>
Section 23.2.2.4 [lib.list.ops] states that
</p>
<pre>
  void splice(iterator position, list&lt;T, Allocator&gt;&amp; x);
</pre>
<p>
<i>invalidates</i> all iterators and references to list <tt>x</tt>.
</p>

<p>
But what does the C++ Standard mean by "invalidate"?  You
can still dereference the iterator to a spliced list element, but
you'd better not use it to delimit a range within the original
list. For the latter operation, it has definitely lost some of its
validity.
</p>

<p>
If we accept the proposed resolution to issue <a href="lwg-active.html#250">250</a>,
then we'd better clarify that a "valid" iterator need no
longer designate an element within the same container as it once did.
We then have to clarify what we mean by invalidating a past-the-end
iterator, as when a vector or string grows by reallocation. Clearly,
such an iterator has a different kind of validity. Perhaps we should
introduce separate terms for the two kinds of "validity."
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
        <hr>
        <a name="279">
            <h3>279.&nbsp;const and non-const iterators should have equivalent typedefs</h3>
        </a>
        <p>
            <b>Section:</b> 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Steve Cleary <b>Date:</b>&nbsp;27 Nov 2000</p>

<p>
This came from an email from Steve Cleary to Fergus in reference to
issue <a href="lwg-active.html#179">179</a>. The library working group briefly discussed
this in Toronto and believes it should be a separate issue.
</p>

<p>
Steve said: "We may want to state that the const/non-const iterators must have
the same difference type, size_type, and category."
</p>

<p>
(Comment from Judy)
I'm not sure if the above sentence should be true for all
const and non-const iterators in a particular container, or if it means 
the container's iterator can't be compared with the container's
const_iterator unless the above it true. I suspect the former.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
In <b>Section:</b> 23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>,
table 65, in the assertion/note pre/post condition for X::const_iterator,
add the following:
</p>

<blockquote>
<p>
typeid(X::const_iterator::difference_type) == typeid(X::iterator::difference_type)
</p>

<p>
typeid(X::const_iterator::size_type) == typeid(X::iterator::size_type)
</p>

<p>
typeid(X::const_iterator::category) == typeid(X::iterator::category)
</p>
</blockquote>
<hr>
        <a name="280">
            <h3>280.&nbsp;Comparison of reverse_iterator to const reverse_iterator</h3>
        </a>
        <p>
            <b>Section:</b> 24.4.1 <a href="lib-iterators.html#lib.reverse.iterators">[lib.reverse.iterators]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Steve Cleary <b>Date:</b>&nbsp;27 Nov 2000</p>
<p>
This came from an email from Steve Cleary to Fergus in reference to
issue <a href="lwg-active.html#179">179</a>. The library working group briefly discussed
this in Toronto and believed it should be a separate issue.  There was
also some reservations about whether this was a worthwhile problem to
fix.
</p>

<p>
Steve said: "Fixing reverse_iterator. std::reverse_iterator can
(and should) be changed to preserve these additional
requirements." He also said in email that it can be done without
breaking user's code: "If you take a look at my suggested
solution, reverse_iterator doesn't have to take two parameters; there
is no danger of breaking existing code, except someone taking the
address of one of the reverse_iterator global operator functions, and
I have to doubt if anyone has ever done that. . .  <i>But</i>, just in
case they have, you can leave the old global functions in as well --
they won't interfere with the two-template-argument functions.  With
that, I don't see how <i>any</i> user code could break."
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
<b>Section:</b> 24.4.1.1 <a href="lib-iterators.html#lib.reverse.iterator">[lib.reverse.iterator]</a>
add/change the following declarations:</p>
<pre>
  A) Add a templated assignment operator, after the same manner
        as the templated copy constructor, i.e.:

  template &lt; class U &gt;
  reverse_iterator &lt; Iterator &gt;&amp; operator=(const reverse_iterator&lt; U &gt;&amp; u);

  B) Make all global functions (except the operator+) have
  two template parameters instead of one, that is, for
  operator ==, !=, &lt;, &gt;, &lt;=, &gt;=, - replace:

       template &lt; class Iterator &gt;
       typename reverse_iterator&lt; Iterator &gt;::difference_type operator-(
                 const reverse_iterator&lt; Iterator &gt;&amp; x,
                 const reverse_iterator&lt; Iterator &gt;&amp; y);

  with:

      template &lt; class Iterator1, class Iterator2 &gt;
      typename reverse_iterator &lt; Iterator1 &gt;::difference_type operator-(
                 const reverse_iterator &lt; Iterator1 &gt; &amp; x,
                 const reverse_iterator &lt; Iterator2 &gt; &amp; y);
</pre>
<p>
Also make the addition/changes for these signatures in 
24.4.1.3 <a href="lib-iterators.html#lib.reverse.iter.ops">[lib.reverse.iter.ops]</a>.
</p>
<hr>
        <a name="281">
            <h3>281.&nbsp;std::min() and max() requirements overly restrictive</h3>
        </a>
        <p>
            <b>Section:</b> 25.3.7 <a href="lib-algorithms.html#lib.alg.min.max">[lib.alg.min.max]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;02 Dec 2000</p>
<p>The requirements in 25.3.7, p1 and 4 call for T to satisfy the
requirements of <tt>LessThanComparable</tt> (20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>)
and <tt>CopyConstructible</tt> (20.1.3 <a href="lib-utilities.html#lib.copyconstructible">[lib.copyconstructible]</a>).
Since the functions take and return their arguments and result by
const reference, I believe the <tt>CopyConstructible</tt> requirement
is unnecessary.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Remove the <tt>CopyConstructible</tt> requirement. Specifically, replace
25.3.7, p1 with</p>
<p>
            <b>-1- Requires:</b> Type T is <tt>LessThanComparable</tt> 
(20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).
</p>
<p>and replace 25.3.7, p4 with</p>
<p>
            <b>-4- Requires:</b> Type T is <tt>LessThanComparable</tt> 
(20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).
</p>
<hr>
        <a name="282">
            <h3>282.&nbsp;What types does numpunct grouping refer to?</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.2.2.2 <a href="lib-locales.html#lib.facet.num.put.virtuals">[lib.facet.num.put.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Howard Hinnant <b>Date:</b>&nbsp;5 Dec 2000</p>
<p>
Paragraph 16 mistakenly singles out integral types for inserting 
thousands_sep() characters.  This conflicts with the syntax for floating 
point numbers described under 22.2.3.1/2.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change paragraph 16 from:</p>

<blockquote>
For integral types, punct.thousands_sep() characters are inserted into 
the sequence as determined by the value returned by punct.do_grouping() 
using the method described in 22.2.3.1.2 <a href="lib-locales.html#lib.facet.numpunct.virtuals">[lib.facet.numpunct.virtuals]</a>.
</blockquote>

<p>To:</p>

<blockquote>
For arithmetic types, punct.thousands_sep() characters are inserted into 
the sequence as determined by the value returned by punct.do_grouping() 
using the method described in 22.2.3.1.2 <a href="lib-locales.html#lib.facet.numpunct.virtuals">[lib.facet.numpunct.virtuals]</a>.
</blockquote>
<hr>
        <a name="283">
            <h3>283.&nbsp;std::replace() requirement incorrect/insufficient</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.4 <a href="lib-algorithms.html#lib.alg.replace">[lib.alg.replace]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;15 Dec 2000</p>
<p>
The requirements in 25.2.4 <a href="lib-algorithms.html#lib.alg.replace">[lib.alg.replace]</a>, p1 that <tt>T</tt> to be
<tt>Assignable</tt> (23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>) is not necessary or
sufficient for either of the algorithms. The algorithms require that
<tt>std::iterator_traits&lt;ForwardIterator&gt;::value_type</tt> be
<tt>Assignable</tt> and that both
<tt>std::iterator_traits&lt;ForwardIterator&gt;::value_type</tt> and be
<tt>EqualityComparable</tt> (20.1.1 <a href="lib-utilities.html#lib.equalitycomparable">[lib.equalitycomparable]</a>) with respect to
one another.
</p>

<p>
Note that a similar problem occurs in several other places in section
25 as well (e.g., 25.1.6 <a href="lib-algorithms.html#lib.alg.count">[lib.alg.count]</a>, or 25.2.5 <a href="lib-algorithms.html#lib.alg.fill">[lib.alg.fill]</a>) so
what really needs to happen is for all those places to be identified
and corrected. The proposed resolution below addresses only 25.2.4.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 25.2.4, p1 from</p>

<blockquote>
<b>-1- Requires:</b>Type <tt>T</tt> is <tt>Assignable</tt> 
(23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>) (and, for <tt>replace()</tt>, 
<tt>EqualityComparable</tt> (20.1.1 <a href="lib-utilities.html#lib.equalitycomparable">[lib.equalitycomparable]</a>)).
</blockquote>

<p>to</p>

<blockquote>
<b>-1- Requires:</b>Type
<tt>std::iterator_traits&lt;ForwardIterator&gt;::value_type</tt>
is <tt>Assignable</tt> (23.1 <a href="lib-containers.html#lib.container.requirements">[lib.container.requirements]</a>), the type <tt>T</tt> is
convertible to<tt>std::iterator_traits&lt;ForwardIterator&gt;::value_type</tt>,
(and, for <tt>replace()</tt>, types
<tt>std::iterator_traits&lt;ForwardIterator&gt;::value_type</tt> and
<tt>T</tt> are <tt>EqualityComparable</tt> (20.1.1 <a href="lib-utilities.html#lib.equalitycomparable">[lib.equalitycomparable]</a>)
with respect to one another).
</blockquote>
<hr>
        <a name="284">
            <h3>284.&nbsp;unportable example in 20.3.7, p6</h3>
        </a>
        <p>
            <b>Section:</b> 20.3.7 <a href="lib-utilities.html#lib.function.pointer.adaptors">[lib.function.pointer.adaptors]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;26 Dec 2000</p>
<p>The example in 20.3.7 <a href="lib-utilities.html#lib.function.pointer.adaptors">[lib.function.pointer.adaptors]</a>, p6 shows how to use the C
library function <tt>strcmp()</tt> with the function pointer adapter
<tt>ptr_fun()</tt>. But since it's unspecified whether the C library
functions have <tt>extern "C"</tt> or <tt>extern
"C++"</tt> linkage [17.4.2.2 <a href="lib-intro.html#lib.using.linkage">[lib.using.linkage]</a>], and since
function pointers with different the language linkage specifications
(7.5 <a href="dcl.html#dcl.link">[dcl.link]</a>) are incompatible, whether this example is
well-formed is unspecified.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace the code snippet in the following text</p>
<blockquote>
  <p>
                <b>-6- </b>[<i>Example:</i>
            </p>
  <pre>
    replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(strcmp), "C")), "C++");
  </pre>
</blockquote>


<p>with</p>
<blockquote>
  <p>
                <b>-6- </b>[<i>Example:</i>
            </p>
  <pre>
    int compare(const char*, const char*);
    replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(compare), "C")), "C++");
  </pre>
</blockquote>
<hr>
        <a name="285">
            <h3>285.&nbsp;minor editorial errors in fstream ctors</h3>
        </a>
        <p>
            <b>Section:</b> 27.8.1.6 <a href="lib-iostreams.html#lib.ifstream.cons">[lib.ifstream.cons]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;31 Dec 2000</p>
<p>27.8.1.6 <a href="lib-iostreams.html#lib.ifstream.cons">[lib.ifstream.cons]</a>, p2, 27.8.1.9 <a href="lib-iostreams.html#lib.ofstream.cons">[lib.ofstream.cons]</a>, p2, and
27.8.1.12 <a href="lib-iostreams.html#lib.fstream.cons">[lib.fstream.cons]</a>, p2 say about the effects of each constructor:
</p>

<p>... If that function returns a null pointer, calls
<tt>setstate(failbit)</tt> (which may throw <tt>ios_base::failure</tt>).
</p>

<p>The parenthetical note doesn't apply since the ctors cannot throw an
exception due to the requirement in 27.4.4.1 <a href="lib-iostreams.html#lib.basic.ios.cons">[lib.basic.ios.cons]</a>, p3 
that <tt>exceptions()</tt> be initialized to <tt>ios_base::goodbit</tt>.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Strike the parenthetical note from the Effects clause in each of the
paragraphs mentioned above.
</p>
<hr>
        <a name="286">
            <h3>286.&nbsp;&lt;cstdlib&gt; requirements missing size_t typedef</h3>
        </a>
        <p>
            <b>Section:</b> 25.4 <a href="lib-algorithms.html#lib.alg.c.library">[lib.alg.c.library]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;30 Dec 2000</p>
<p>
The &lt;cstdlib&gt; header file contains prototypes for bsearch and
qsort (C++ Standard section 25.4 paragraphs 3 and 4) and other
prototypes (C++ Standard section 21.4 paragraph 1 table 49) that
require the typedef size_t. Yet size_t is not listed in the
&lt;cstdlib&gt; synopsis table 78 in section 25.4.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Add the type size_t to Table 78 (section 25.4) and add
the type size_t &lt;cstdlib&gt; to Table 97 (section C.2).
</p>
<hr>
        <a name="287">
            <h3>287.&nbsp;&lt;cstdlib&gt; conflicting ios_base fmtflags</h3>
        </a>
        <p>
            <b>Section:</b> 27.4.2.2 <a href="lib-iostreams.html#lib.fmtflags.state">[lib.fmtflags.state]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;30 Dec 2000</p>
<p>
The Effects clause for ios_base::setf(fmtflags fmtfl) says
"Sets fmtfl in flags()".  What happens if the user first calls
ios_base::scientific and then calls ios_base::fixed or vice-versa?
This is an issue for all of the conflicting flags, i.e. ios_base::left
and ios_base::right or ios_base::dec, ios_base::hex and ios_base::oct.
</p>

<p>
I see three possible solutions: 
</p>

<ol>
<li>Set ios_base::failbit whenever the user specifies a conflicting
flag with one previously explicitly set. If the constructor is
supposed to set ios_base::dec (see discussion below), then
the user setting hex or oct format after construction will not
set failbit. </li>
<li>The last call to setf "wins", i.e. it clears any conflicting
previous setting.</li>
<li>All the flags that the user specifies are set, but when actually 
interpreting them, fixed always override scientific, right always 
overrides left, dec overrides hex which overrides oct.</li>
</ol>

<p>
Most existing implementations that I tried seem to conform to resolution #3,
except that when using the iomanip manipulator hex or oct then that always 
overrides dec, but calling setf(ios_base::hex) doesn't. 
</p>

<p>
There is a sort of related issue, which is that although the ios_base
constructor says that each ios_base member has an indeterminate value
after construction, all the existing implementations I tried explicitly set 
ios_base::dec.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
        <hr>
        <a name="288">
            <h3>288.&nbsp;&lt;cerrno&gt; requirements missing macro EILSEQ</h3>
        </a>
        <p>
            <b>Section:</b> 19.3 <a href="lib-diagnostics.html#lib.errno">[lib.errno]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;30 Dec 2000</p>
<p>
ISO/IEC 9899:1990/Amendment1:1994 Section 4.3 States: "The list
of macros defined in &lt;errno.h&gt; is adjusted to include a new
macro, EILSEQ"
</p>

<p>
ISO/IEC 14882:1998(E) section 19.3 does not refer
to the above amendment.
</p>

<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Update Table 26 (section 19.3) "Header  &lt;cerrno&gt; synopsis"
and Table 95 (section C.2) "Standard Macros" to include EILSEQ.
</p>
<hr>
        <a name="289">
            <h3>289.&nbsp;&lt;cmath&gt; requirements missing C float and long double versions</h3>
        </a>
        <p>
            <b>Section:</b> 26.5 <a href="lib-numerics.html#lib.c.math">[lib.c.math]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Judy Ward <b>Date:</b>&nbsp;30 Dec 2000</p>
<p>
    In ISO/IEC 9899:1990 Programming Languages C we find the following
    concerning &lt;math.h&gt;:
</p>

<blockquote>
         7.13.4 Mathematics &lt;math.h&gt;
         <br>
         The names of all existing functions declared in the &lt;math.h&gt;
         header, suffixed with f or l, are reserved respectively for
         corresponding functions with float and long double arguments
         are return values.
</blockquote>

<p>
    For example, <tt>float&nbsp;sinf(float)</tt>
    is reserved.
</p>

<p>
    In the C99 standard, &lt;math.h&gt; must contain declarations
    for these functions.
</p>

<p>
So, is it acceptable for an implementor to add these prototypes to the
C++ versions of the math headers? Are they required?
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Add these Functions to Table 80, section 26.5 and to Table 99,
section C.2:
</p>

<pre>
    acosf asinf atanf atan2f ceilf cosf coshf 
    expf fabsf floorf fmodf frexpf ldexpf 
    logf log10f modff powf sinf sinhf sqrtf 
    tanf tanhf 
    acosl asinl atanl atan2l ceill cosl coshl 
    expl fabsl floorl fmodl frexpl ldexpl 
    logl log10l modfl powl sinl sinhl sqrtl 
    tanl tanhl
</pre>

<p>
There should probably be a note saying that these functions
are optional and, if supplied, should match the description in
the 1999 version of the C standard. In the next round
of C++ standardization they can then become mandatory. 
</p>
<hr>
        <a name="290">
            <h3>290.&nbsp;Requirements to for_each and its function object</h3>
        </a>
        <p>
            <b>Section:</b> 25.1.1 <a href="lib-algorithms.html#lib.alg.foreach">[lib.alg.foreach]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;03 Jan 2001</p>
<p>The specification of the for_each algorithm does not have a
"Requires" section, which means that there are no
restrictions imposed on the function object whatsoever. In essence it
means that I can provide any function object with arbitrary side
effects and I can still expect a predictable result. In particular I
can expect that the function object is applied exactly last - first
times, which is promised in the "Complexity" section.
</p>

<p>I don't see how any implementation can give such a guarantee
without imposing requirements on the function object.
</p>

<p>Just as an example: consider a function object that removes
elements from the input sequence.  In that case, what does the
complexity guarantee (applies f exactly last - first times) mean?
</p>

<p>One can argue that this is obviously a nonsensical application and
a theoretical case, which unfortunately it isn't.  I have seen
programmers shooting themselves in the foot this way, and they did not
understand that there are restrictions even if the description of the
algorithm does not say so.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add a "Requires" section to section 25.1.1 similar to those
proposed for transform and the numeric algorithms (see issue
<a href="lwg-active.html#242">242</a>):
</p>

<blockquote>
    -2- <b>Requires</b>: In the range [first, last], f shall not invalidate
    iterators or subranges.
</blockquote>
<p>
            <b>Rationale:</b>
        </p>
<p>This is a minimum requirement that frees library implementations from
the duty to invoke the function exactly last - first times when the function
object modifies the input range. It imposes restrictions on the user,
however.  The committee will have to decide whether the restrictions
are too severe.
</p>
<hr>
        <a name="291">
            <h3>291.&nbsp;Underspecification of set algorithms</h3>
        </a>
        <p>
            <b>Section:</b> 25.3.5 <a href="lib-algorithms.html#lib.alg.set.operations">[lib.alg.set.operations]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;03 Jan 2001</p>
<p>
The standard library contains four algorithms that compute set
operations on sorted ranges: <tt>set_union</tt>, <tt>set_intersection</tt>,
<tt>set_difference</tt>, and <tt>set_symmetric_difference</tt>.  Each
of these algorithms takes two sorted ranges as inputs, and writes the
output of the appropriate set operation to an output range.  The elements
in the output range are sorted.
</p>

<p>
The ordinary mathematical definitions are generalized so that they
apply to ranges containing multiple copies of a given element.  Two
elements are considered to be "the same" if, according to an
ordering relation provided by the user, neither one is less than the
other.  So, for example, if one input range contains five copies of an
element and another contains three, the output range of <tt>set_union</tt>
will contain five copies, the output range of
<tt>set_intersection</tt> will contain three, the output range of
<tt>set_difference</tt> will contain two, and the output range of
<tt>set_symmetric_difference</tt> will contain two.
</p>

<p>
Because two elements can be "the same" for the purposes
of these set algorithms, without being identical in other respects
(consider, for example, strings under case-insensitive comparison),
this raises a number of unanswered questions:
</p>

<ul>
<li>If we're copying an element that's present in both of the
input ranges, which one do we copy it from?</li>
<li>If there are <i>n</i> copies of an element in the relevant
input range, and the output range will contain fewer copies (say
<i>m</i>) which ones do we choose?  The first <i>m</i>, or the last
<i>m</i>, or something else?</li>
<li>Are these operations stable?  That is, does a run of equivalent
elements appear in the output range in the same order as as it
appeared in the input range(s)?</li>
</ul>

<p>
The standard should either answer these questions, or explicitly
say that the answers are unspecified.  I prefer the former option,
since, as far as I know, all existing implementations behave the
same way.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
        <hr>
        <a name="292">
            <h3>292.&nbsp;effects of a.copyfmt (a)</h3>
        </a>
        <p>
            <b>Section:</b> 27.4.4.2 <a href="lib-iostreams.html#lib.basic.ios.members">[lib.basic.ios.members]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;05 Jan 2001</p>
<p>The Effects clause of the member function <tt>copyfmt()</tt> in
27.4.4.2, p15 doesn't consider the case where the left-hand side
argument is identical to the argument on the right-hand side, that is
<tt>(this == &amp;rhs)</tt>.  If the two arguments are identical there
is no need to copy any of the data members or call any callbacks
registered with <tt>register_callback()</tt>.  Also, as Howard Hinnant
points out in message c++std-lib-8149 it appears to be incorrect to
allow the object to fire <tt>erase_event</tt> followed by
<tt>copyfmt_event</tt> since the callback handling the latter event
may inadvertently attempt to access memory freed by the former.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change the Effects clause in 27.4.4.2, p15 from</p>

<blockquote>
<b>-15- Effects:</b>Assigns to the member objects of <tt>*this</tt>
the corresponding member objects of <tt>rhs</tt>, except that...
</blockquote>

<p>to</p>

<blockquote>
<b>-15- Effects:</b>If <tt>(this == &amp;rhs)</tt> does nothing. Otherwise
assigns to the member objects of <tt>*this</tt> the corresponding member
objects of <tt>rhs</tt>, except that...
</blockquote>
<hr>
        <a name="293">
            <h3>293.&nbsp;Order of execution in transform algorithm</h3>
        </a>
        <p>
            <b>Section:</b> 25.2.3 <a href="lib-algorithms.html#lib.alg.transform">[lib.alg.transform]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Angelika Langer <b>Date:</b>&nbsp;04 Jan 2001</p>
<p>This issue is related to issue 242.  In case that the resolution
proposed for issue 242 is accepted, we have have the following
situation: The 4 numeric algorithms (accumulate and consorts) as well
as transform would allow a certain category of side effects.  The
numeric algorithms specify that they invoke the functor "for
every iterator i in the range [first, last) in order". transform,
in contrast, would not give any guarantee regarding order of
invocation of the functor, which means that the functor can be invoked
in any arbitrary order.
</p>

<p>Why would that be a problem?  Consider an example: say the
transformator that is a simple enumerator ( or more generally
speaking, "is order-sensitive" ).  Since a standard
compliant implementation of transform is free to invoke the enumerator
in no definite order, the result could be a garbled enumeration.
Strictly speaking this is not a problem, but it is certainly at odds
with the prevalent understanding of transform as an algorithms that
assigns "a new _corresponding_ value" to the output
elements.
</p>

<p>All implementations that I know of invoke the transformator in
definite order, namely starting from first and proceeding to last -
1. Unless there is an optimization conceivable that takes advantage of
the indefinite order I would suggest to specify the order, because it
eliminate the uncertainty that users would otherwise have regarding
the order of execution of their potentially order-sensitive function
objects.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In section 25.2.3 - Transform [lib.alg.transform] change:</p>
<blockquote>
-1- Effects: Assigns through every iterator i in the range [result,
result + (last1 - first1)) a new corresponding
value equal to op(*(first1 + (i - result)) or binary_op(*(first1 +
(i - result), *(first2 + (i - result))).
</blockquote>
<p>to:</p>
<blockquote>
-1- Effects: Computes values by  invoking the operation op or binary_op 
for every iterator in the range [first1, last1) in order. Assigns through
every iterator i in the range [result, result + (last1 - first1)) a new
corresponding
value equal to op(*(first1 + (i - result)) or binary_op(*(first1 +
(i - result), *(first2 + (i - result))).
</blockquote>
<hr>
        <a name="294">
            <h3>294.&nbsp;User defined macros and standard headers</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.3.1.1 <a href="lib-intro.html#lib.macro.names">[lib.macro.names]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;James Kanze <b>Date:</b>&nbsp;11 Jan 2001</p>
<p>Paragraph 2 of 17.4.3.1.1 <a href="lib-intro.html#lib.macro.names">[lib.macro.names]</a> reads: "A
translation unit that includes a header shall not contain any macros
that define names declared in that header." As I read this, it
would mean that the following program is legal:</p>

<pre>
  #define npos 3.14
  #include &lt;sstream&gt;
</pre>

<p>since npos is not defined in &lt;sstream&gt;.  It is, however, defined
in &lt;string&gt;, and it is hard to imagine an implementation in
which &lt;sstream&gt; didn't include &lt;string&gt;.</p>

<p>I think that this phrase was probably formulated before it was
decided that a standard header may freely include other standard
headers.  The phrase would be perfectly appropriate for C, for
example.  In light of 17.4.4.1 <a href="lib-intro.html#lib.res.on.headers">[lib.res.on.headers]</a> paragraph 1, however,
it isn't stringent enough.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In paragraph 2 of 17.4.3.1.1 <a href="lib-intro.html#lib.macro.names">[lib.macro.names]</a>, change "A
translation unit that includes a header shall not contain any macros
that define names declared in that header." to "A
translation unit that includes a header shall not contain any macros
that define names declared in any standard header."</p>
<hr>
        <a name="295">
            <h3>295.&nbsp;Is abs defined in &lt;cmath&gt;?</h3>
        </a>
        <p>
            <b>Section:</b> 26.5 <a href="lib-numerics.html#lib.c.math">[lib.c.math]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Jens Maurer <b>Date:</b>&nbsp;12 Jan 2001</p>
<p>
Table 80 lists the contents of the &lt;cmath&gt; header.  It does not
list <tt>abs()</tt>.  However, 26.5, paragraph 6, which lists added 
signatures present in &lt;cmath&gt;, does say that several overloads
of <tt>abs()</tt> should be defined in &lt;cmath&gt;.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Add <tt>abs</tt> to Table 80.
</p>
<hr>
        <a name="296">
            <h3>296.&nbsp;Missing descriptions and requirements of pair operators</h3>
        </a>
        <p>
            <b>Section:</b> 20.2.2 <a href="lib-utilities.html#lib.pairs">[lib.pairs]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;14 Jan 2001</p>
<p>The synopsis of the header <tt>&lt;utility&gt;</tt> in 20.2 <a href="lib-utilities.html#lib.utility">[lib.utility]</a>
lists the complete set of equality and relational operators for <tt>pair</tt>
but the section describing the template and the operators only describes
<tt>operator==()</tt> and <tt>operator&lt;()</tt>, and it fails to mention
any requirements on the template arguments. The remaining operators are
not mentioned at all.
</p> 
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Since it is a convention used throughout the rest of the document to
group non-member functions and templates provided as part of the interface
of a class or a template into their own separate section, I propose to
add a separate subsection for non-member pair function templates after
20.2.2, p4, containing the current paragraphs 5 through 8 as well as the
descriptions of the missing functions. That is, add after</p>

<blockquote>
<p>
                <tt>template&lt;class U, class V&gt; 
       pair(const pair&lt;U, V&gt;&amp;p);</tt>
            </p>

<p>
                <b>-4- Effects:</b>Initializes members from the corresponding
members of the argument, performing implicit conversions as
needed.</p>
</blockquote>

<p>the following:</p>

<p>
<b>20.2.2.1 - <tt>pair</tt> non-member functions [lib.pairs.nonmembers]</b>
</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator==(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-1- Requires:</b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>EqualityComparable</tt> (20.1.1 <a href="lib-utilities.html#lib.equalitycomparable">[lib.equalitycomparable]</a>).</p>

<p>
            <b>-2- Returns: </b><tt>x.first == y.first &amp;&amp; x.second ==
y.second</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator!=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-3- Requires: </b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>EqualityComparable</tt> (20.1.1 <a href="lib-utilities.html#lib.equalitycomparable">[lib.equalitycomparable]</a>).</p> 

<p>
            <b>-4- Returns:</b> <tt>!(x == y)</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator&lt;(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-5- Requires: </b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>LessThanComparable</tt> (20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).</p> 

<p>
            <b>-6- Returns: </b><tt>x.first &lt; y.first || (!(y.first &lt;
x.first) &amp;&amp; x.second &lt; y.second)</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator&lt;=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-7- Requires: </b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>LessThanComparable</tt> (20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).</p>

<p>
            <b>-8- Returns: </b><tt>!(y &lt; x)</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator&gt;=(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-9- Requires: </b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>LessThanComparable</tt> (20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).</p>

<p>
            <b>-10- Returns:</b> <tt>!(x &lt; y)</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>bool operator&gt;(const pair&lt;T1, T2&gt;&amp; x, const pair&lt;T1,
T2&gt;&amp; y);</tt>
</blockquote>

<p>
            <b>-11- Requires: </b>Types <tt>T1</tt> and <tt>T2</tt> are
<tt>LessThanComparable</tt> (20.1.2 <a href="lib-utilities.html#lib.lessthancomparable">[lib.lessthancomparable]</a>).</p>

<p>
            <b>-12- Returns:</b> <tt>y &lt; x</tt>.</p>

<blockquote>
<tt>template &lt;class T1, class T2&gt;</tt>
<br>
            <tt>pair&lt;T1, T2&gt; make_pair(const T1&amp; x, const T2&amp; y);</tt>
</blockquote>

<p>
            <b>-- Returns: </b><tt>pair&lt;T1, T2&gt;(x, y)</tt>.</p>

<p>
            <b>-12- [</b><i>Example: </i>In place of:</p>

<blockquote>
<tt>return pair&lt;int, double&gt;(5, 3.1415926);&nbsp;&nbsp;
//&nbsp; explicit types</tt>
</blockquote>

<p>a C++ program may contain:</p>

<blockquote>
<tt>return make_pair(5,
3.1415926);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp; types are deduced</tt>
</blockquote>

<p>--- end example]</p>

<p>
            <b>Note: </b>Since the accepted resolution of the library issue 
<a href="lwg-defects.html#181">181</a> changes the signature of <tt>make_pair</tt>, it must 
be reflected in the resolution of this issue should it too be accepted.
</p>
<hr>
        <a name="297">
            <h3>297.&nbsp;const_mem_fun_t&lt;&gt;::argument_type should be const T*</h3>
        </a>
        <p>
            <b>Section:</b> 20.3.8 <a href="lib-utilities.html#lib.member.pointer.adaptors">[lib.member.pointer.adaptors]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;6 Jan 2001</p>
<p>The class templates <tt>const_mem_fun_t</tt> in 20.3.8, p8 and
<tt>const_mem_fun1_t</tt>
in 20.3.8, p9 derive from <tt>unary_function&lt;T*, S&gt;</tt>, and
<tt>binary_function&lt;T*,
A, S&gt;</tt>, respectively. Consequently, their <tt>argument_type</tt>, and
<tt>first_argument_type</tt>
members, respectively, are both defined to be <tt>T*</tt> (non-const).
However, their function call member operator takes a <tt>const T*</tt>
argument. It is my opinion that <tt>argument_type</tt> should be <tt>const
T*</tt> instead, so that one can easily refer to it in generic code. The
example below derived from existing code fails to compile due to the
discrepancy:
</p>

<p>
            <tt>template &lt;class T&gt;</tt>
<br>
            <tt>void foo (typename T::argument_type arg)&nbsp;&nbsp; // #1</tt>
<br>
            <tt>{</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp; typename T::result_type (T::*pf) (typename
T::argument_type)
const =&nbsp;&nbsp; // #2</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;T::operator();</tt>
<br>
            <tt>}</tt>
</p>

<p>
            <tt>struct X { /* ... */ };</tt>
        </p>

<p>
            <tt>int main ()</tt>
<br>
            <tt>{</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp; const X x;</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp; foo&lt;std::const_mem_fun_t&lt;void, X&gt;
&gt;(&amp;x);&nbsp;&nbsp;
// #3</tt>
<br>
            <tt>}</tt>
</p>

<p>#1 <tt>foo()</tt> takes a plain unqualified <tt>X*</tt> as an argument
<br>#2 the type of the pointer is incompatible with the type of the member
function
<br>#3 the address of a constant being passed to a function taking a non-const
<tt>X*</tt>
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace the top portion of the definition of the class template
const_mem_fun_t in 20.3.8, p8
</p>
<p>
            <tt>template &lt;class S, class T&gt; class const_mem_fun_t</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
unary_function&lt;T*, S&gt; {</tt>
</p>
<p>with</p>
<p>
            <tt>template &lt;class S, class T&gt; class const_mem_fun_t</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
unary_function&lt;<b>const</b> T*, S&gt; {</tt>
</p>
<p>Also replace the top portion of the definition of the class template
const_mem_fun1_t in 20.3.8, p9</p>
<p>
            <tt>template &lt;class S, class T, class A&gt; class const_mem_fun1_t</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
binary_function&lt;T*, A, S&gt; {</tt>
</p>
<p>with</p>
<p>
            <tt>template &lt;class S, class T, class A&gt; class const_mem_fun1_t</tt>
<br>
            <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
binary_function&lt;<b>const</b> T*, A, S&gt; {</tt>
</p>
<hr>
        <a name="298">
            <h3>298.&nbsp;::operator delete[] requirement incorrect/insufficient</h3>
        </a>
        <p>
            <b>Section:</b> 18.4.1.2 <a href="lib-support.html#lib.new.delete.array">[lib.new.delete.array]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;John A. Pedretti <b>Date:</b>&nbsp;10 Jan 2001</p>
<p>
The default behavior of <tt>operator delete[]</tt> described in 18.4.1.2, p12 -
namely that for non-null value of <i>ptr</i>, the operator reclaims storage
allocated by the earlier call to the default <tt>operator new[]</tt> - is not
correct in all cases. Since the specified <tt>operator new[]</tt> default
behavior is to call <tt>operator new</tt> (18.4.1.2, p4, p8), which can be
replaced, along with <tt>operator delete</tt>, by the user, to implement their
own memory management, the specified default behavior of<tt> operator
delete[]</tt> must be to call <tt>operator delete</tt>.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 18.4.1.2, p12 from</p>
<blockquote>
<b>-12-</b> <b>Default behavior:</b>
<ul>
<li>
For a null value of <i><tt>ptr</tt></i> , does nothing.
</li>
<li>
Any other value of <i><tt>ptr</tt></i> shall be a value returned
earlier by a call to the default <tt>operator new[](std::size_t)</tt>.
[Footnote: The value must not have been invalidated by an intervening
call to <tt>operator delete[](void*)</tt> (17.4.3.7 <a href="lib-intro.html#lib.res.on.arguments">[lib.res.on.arguments]</a>).
--- end footnote]
For such a non-null value of <i><tt>ptr</tt></i> , reclaims storage
allocated by the earlier call to the default <tt>operator new[]</tt>.
</li>
</ul>
</blockquote>

<p>to</p>

<blockquote>
<b>-12-</b> <b>Default behavior: </b>Calls <tt>operator
delete(</tt><i>ptr</i>)
or <tt>operator delete(<i>ptr</i>, std::nothrow)</tt> respectively.
</blockquote>
<p>and expunge paragraph 13.</p>
<hr>
        <a name="299">
            <h3>299.&nbsp;Incorrect return types for iterator dereference</h3>
        </a>
        <p>
            <b>Section:</b> 24.1.4 <a href="lib-iterators.html#lib.bidirectional.iterators">[lib.bidirectional.iterators]</a>, 24.1.5 <a href="lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;John Potter <b>Date:</b>&nbsp;22 Jan 2001</p>
<p>
In section 24.1.4 <a href="lib-iterators.html#lib.bidirectional.iterators">[lib.bidirectional.iterators]</a>,
Table 75 gives the return type of *r-- as convertible to T.  This is
not consistent with Table 74 which gives the return type of *r++ as
T&amp;.  *r++ = t is valid while *r-- = t is invalid.
</p>

<p>
In section 24.1.5 <a href="lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</a>,
Table 76 gives the return type of a[n] as convertible to T.  This is
not consistent with the semantics of *(a + n) which returns T&amp; by
Table 74.  *(a + n) = t is valid while a[n] = t is invalid.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>In section 24.1.4 <a href="lib-iterators.html#lib.bidirectional.iterators">[lib.bidirectional.iterators]</a>, change the return type in table
75 from "convertible to T" to T&amp;.</p>

<p>In section 24.1.5 <a href="lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</a>, change the return type in table
76 from "convertible to T" to T&amp;.</p>
<hr>
        <a name="300">
            <h3>300.&nbsp;list::merge() specification incomplete</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.2.4 <a href="lib-containers.html#lib.list.ops">[lib.list.ops]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;John Pedretti <b>Date:</b>&nbsp;23 Jan 2001</p>
<p>
The "Effects" clause for list::merge() (23.2.2.4, p23)
appears to be incomplete: it doesn't cover the case where the argument
list is identical to *this (i.e., this == &amp;x). The requirement in the
note in p24 (below) is that x be empty after the merge which is surely
unintended in this case.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
Change 23.2.2.4, p23 to:
</p>
<blockquote>
<b>Effects</b>: If &amp;x == this, does nothing; otherwise, merges the
argument list into the list.
</blockquote>
<hr>
        <a name="301">
            <h3>301.&nbsp;basic_string template ctor effects clause omits allocator argument</h3>
        </a>
        <p>
            <b>Section:</b> 21.3.1 <a href="lib-strings.html#lib.string.cons">[lib.string.cons]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;27 Jan 2001</p>
<p>
The effects clause for the basic_string template ctor in 21.3.1, p15
leaves out the third argument of type Allocator. I believe this to be
a mistake.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Replace</p>

<blockquote>
    <p>
                <b>-15- Effects:</b> If <i><tt>InputIterator</tt></i> is an integral
    type, equivalent to</p>

    <blockquote>
                <tt>basic_string(static_cast&lt;size_type&gt;(begin),
    static_cast&lt;value_type&gt;(end))</tt>
            </blockquote>
</blockquote>

<p>with</p>

<blockquote>
    <p>
                <b>-15- Effects:</b> If <i><tt>InputIterator</tt></i> is an integral
    type, equivalent to</p>

    <blockquote>
                <tt>basic_string(static_cast&lt;size_type&gt;(begin),
    static_cast&lt;value_type&gt;(end), <b>a</b>)</tt>
            </blockquote>
</blockquote>
<hr>
        <a name="302">
            <h3>302.&nbsp;Need error indication from codecvt&lt;&gt;::do_length</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.1.5.2 <a href="lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Gregory Bumgardner <b>Date:</b>&nbsp;25 Jan 2001</p>
<p>
The effects of <tt>codecvt&lt;&gt;::do_length()</tt> are described in
22.2.1.5.2, paragraph 10.  As implied by that paragraph, and clarified
in issue <a href="lwg-defects.html#75">75</a>, <tt>codecvt&lt;&gt;::do_length()</tt> must
process the source data and update the <tt>stateT</tt> argument just
as if the data had been processed by <tt>codecvt&lt;&gt;::in()</tt>.
However, the standard does not specify how <tt>do_length()</tt> would
report a translation failure, should the source sequence contain
untranslatable or illegal character sequences.
</p>

<p>
The other conversion methods return an "error" result value
to indicate that an untranslatable character has been encountered, but
<tt>do_length()</tt> already has a return value (the number of source
characters that have been processed by the method).
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
This issue cannot be resolved without modifying the interface. An exception
cannot be used, as there would be no way to determine how many characters
have been processed and the state object would be left in an indeterminate
state.
</p>

<p>
A source compatible solution involves adding a fifth argument to length()
and do_length() that could be used to return position of the offending
character sequence. This argument would have a default value that would
allow it to be ignored:
</p>

<pre>
  int length(stateT&amp; state, 
             const externT* from, 
             const externT* from_end, 
             size_t max,
             const externT** from_next = 0);

  virtual
  int do_length(stateT&amp; state, 
                const externT* from, 
                const externT* from_end, 
                size_t max,
                const externT** from_next);
</pre>

<p>
Then an exception could be used to report any translation errors and
the from_next argument, if used, could then be used to retrieve the
location of the offending character sequence.
</p>
<hr>
        <a name="303">
            <h3>303.&nbsp;Bitset input operator underspecified</h3>
        </a>
        <p>
            <b>Section:</b> 23.3.5.3 <a href="lib-containers.html#lib.bitset.operators">[lib.bitset.operators]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Matt Austern <b>Date:</b>&nbsp;5 Feb 2001</p>
<p>
In 23.3.5.3, we are told that <tt>bitset</tt>'s input operator
"Extracts up to <i>N</i> (single-byte) characters from
<i>is</i>.", where <i>is</i> is a stream of type
<tt>basic_istream&lt;charT, traits&gt;</tt>.
</p>

<p>
The standard does not say what it means to extract single byte
characters from a stream whose character type, <tt>charT</tt>, is in
general not a single-byte character type.  Existing implementations
differ.
</p>

<p>
A reasonable solution will probably involve <tt>widen()</tt> and/or
<tt>narrow()</tt>, since they are the supplied mechanism for a single
character between <tt>char</tt> and arbitrary <tt>charT</tt>.
</p>

<p>Narrowing the input characters is not the same as widening the
literals <tt>'0'</tt> and <tt>'1'</tt>, because there may be some
locales in which more than one wide character maps to the narrow
character <tt>'0'</tt>.  Narrowing means that alternate
representations may be used for bitset input, widening means that
they may not be.</p>

<p>Note that for numeric input, <tt>num_get&lt;&gt;</tt>
(22.2.2.1.2/8) compares input characters to widened version of narrow
character literals.</p>

<p>From Pete Becker, in c++std-lib-8224:</p>
<blockquote>
<p>
Different writing systems can have different representations for the
digits that represent 0 and 1. For example, in the Unicode representation
of the Devanagari script (used in many of the Indic languages) the digit 0
is 0x0966, and the digit 1 is 0x0967. Calling narrow would translate those
into '0' and '1'. But Unicode also provides the ASCII values 0x0030 and
0x0031 for for the Latin representations of '0' and '1', as well as code
points for the same numeric values in several other scripts (Tamil has no
character for 0, but does have the digits 1-9), and any of these values
would also be narrowed to '0' and '1'.
</p>

<p>...</p>

<p>
It's fairly common to intermix both native and Latin
representations of numbers in a document. So I think the rule has to be
that if a wide character represents a digit whose value is 0 then the bit
should be cleared; if it represents a digit whose value is 1 then the bit
should be set; otherwise throw an exception. So in a Devanagari locale,
both 0x0966 and 0x0030 would clear the bit, and both 0x0967 and 0x0031
would set it. Widen can't do that. It would pick one of those two values,
and exclude the other one.
</p>

</blockquote>

<p>From Jens Maurer, in c++std-lib-8233:</p>

<blockquote>
<p>
Whatever we decide, I would find it most surprising if
bitset conversion worked differently from int conversion
with regard to alternate local representations of
numbers.
</p>

<p>Thus, I think the options are:</p>
<ul>
 <li> Have a new defect issue for 22.2.2.1.2/8 so that it will
require the use of narrow().</li>

 <li> Have a defect issue for bitset() which describes clearly
that widen() is to be used.</li>
</ul>
</blockquote>
<p>
            <b>Proposed resolution:</b>
        </p>

<p>Alternative A:</p>
    <blockquote>
    <p>Replace the first sentence of paragraph 5 with:</p>

    <blockquote>
    Extracts up to <i>N</i> characters from <i>is</i>, converting each
    character <tt>c</tt> to <tt>char</tt> as if by calling 
    <tt><i>is</i>.narrow(c, ' ')</tt>.
    </blockquote>

    </blockquote>

<p>Alternative B:</p>
    <blockquote>
    <p>Replace the first two sentences of paragraph 5 with:</p>

    <blockquote>
    Extracts up to <i>N</i> characters from <i>is</i>. Stores these
    characters in a temporary object <i>str</i> of type
    <tt>basic_string&lt;charT, traits&gt;</tt>, then evaluates the
    expression <tt><i>x</i> = bitset&lt;N&gt;(<i>str</i>)</tt>.
    </blockquote>

    <p>Replace the third bullet item in paragraph 5 with:</p>
    <ul>
                <li>
    the next input character is neither <tt><i>is</i>.widen(0)</tt>
    nor <tt><i>is</i>.widen(1)</tt> (in which case the input character
    is not extracted).
    </li>
            </ul>

    </blockquote>
<hr>
        <a name="304">
            <h3>304.&nbsp;Must <tt>*a</tt> return an lvalue when <tt>a</tt> is an input iterator?</h3>
        </a>
        <p>
            <b>Section:</b> 24.1 <a href="lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Dave Abrahams <b>Date:</b>&nbsp;5 Feb 2001</p>
<p>
We all "know" that input iterators are allowed to produce
values when dereferenced of which there is no other in-memory copy.
</p>

<p>
But: Table 72, with a careful reading, seems to imply that this can only be
the case if the value_type has no members (e.g. is a built-in type).
</p>

<p>The problem occurs in the following entry:</p>

<pre>
  a-&gt;m     pre: (*a).m is well-defined
           Equivalent to (*a).m
</pre>

<p>
<tt>*a.m</tt> can be well-defined if <tt>*a</tt> is not a reference
type, but since <tt>operator-&gt;()</tt> must return a pointer for
<tt>a-&gt;m</tt> to be well-formed, it needs something to return a
pointer <i>to</i>. This seems to indicate that <tt>*a</tt> must be
buffered somewhere to make a legal input iterator.
</p>

<p>I don't think this was intentional.</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>
An sketch of one possible solution: one can return a proxy containing
an instance of the value_type if the proxy has an operator-&gt;(),
since it is required that operator-&gt;() be called again on the
result if defined (see 13.3.3.1 <a href="over.html#over.best.ics">[over.best.ics]</a> paragraph 8, and
footnote 120). This is quirky and not obviously intentional, but
workable.
</p>
<hr>
        <a name="305">
            <h3>305.&nbsp;Default behavior of codecvt&lt;wchar_t, char, mbstate_t&gt;::length()</h3>
        </a>
        <p>
            <b>Section:</b> 22.2.1.5.2 <a href="lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Howard Hinnant <b>Date:</b>&nbsp;24 Jan 2001</p>
<p>22.2.1.5/3 introduces codecvt in part with:</p>

<blockquote>
  codecvt&lt;wchar_t,char,mbstate_t&gt; converts between the native
  character sets for tiny and wide characters. Instantiations on
  mbstate_t perform conversion between encodings known to the library
  implementor.
</blockquote>

<p>But 22.2.1.5.2/10 describes do_length in part with:</p>

<blockquote>
  ... codecvt&lt;wchar_t, char, mbstate_t&gt; ... return(s) the lesser of max and 
  (from_end-from).
</blockquote>

<p>
The semantics of do_in and do_length are linked.  What one does must
be consistent with what the other does.  22.2.1.5/3 leads me to
believe that the vendor is allowed to choose the algorithm that
codecvt&lt;wchar_t,char,mbstate_t&gt;::do_in performs so that it makes
his customers happy on a given platform.  But 22.2.1.5.2/10 explicitly
says what codecvt&lt;wchar_t,char,mbstate_t&gt;::do_length must
return.  And thus indirectly specifies the algorithm that
codecvt&lt;wchar_t,char,mbstate_t&gt;::do_in must perform.  I believe
that this is not what was intended and is a defect.
</p>

<p>Discussion from the -lib reflector:

<br>This proposal would have the effect of making the semantics of
all of the virtual functions in <tt>codecvt&lt;wchar_t, char,
mbstate_t&gt;</tt> implementation specified.  Is that what we want, or
do we want to mandate specific behavior for the base class virtuals
and leave the implementation specified behavior for the codecvt_byname
derived class?  The tradeoff is that former allows implementors to
write a base class that actually does something useful, while the
latter gives users a way to get known and specified---albeit
useless---behavior, and is consistent with the way the standard
handles other facets.  It is not clear what the original intention
was.</p>

<p>
Nathan has suggest a compromise: a character that is a widened version
of the characters in the basic execution character set must be
converted to a one-byte sequence, but there is no such requirement
for characters that are not part of the basic execution character set.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 22.2.1.5.2/10 from:</p>

<blockquote>
-10- Returns: (from_next-from) where from_next is the largest value in
the range [from,from_end] such that the sequence of values in the
range [from,from_next) represents max or fewer valid complete
characters of type internT. The instantiations required in Table 51
(21.1.1.1.1), namely codecvt&lt;wchar_t, char, mbstate_t&gt; and
codecvt&lt;char, char, mbstate_t&gt;, return the lesser of max and
(from_end-from).
</blockquote>

<p>to:</p>

<blockquote>
-10- Returns: (from_next-from) where from_next is the largest value in 
the range [from,from_end] such that the sequence of values in the range 
[from,from_next) represents max or fewer valid complete characters of 
type internT. The instantiation codecvt&lt;char, char, mbstate_t&gt; returns 
the lesser of max and (from_end-from). 
</blockquote>
<hr>
        <a name="306">
            <h3>306.&nbsp;offsetof macro and non-POD types</h3>
        </a>
        <p>
            <b>Section:</b> 18.1 <a href="lib-support.html#lib.support.types">[lib.support.types]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Steve Clamage <b>Date:</b>&nbsp;21 Feb 2001</p> 
<p>Spliced together from reflector messages c++std-lib-8294 and -8295:</p>

<p>18.1, paragraph 5, reads: "The macro <tt>offsetof</tt>
accepts a restricted set of <i>type</i> arguments in this
International Standard. <i>type</i> shall be a POD structure or a POD
union (clause 9). The result of applying the offsetof macro to a field
that is a static data member or a function member is
undefined."</p>

<p>For the POD requirement, it doesn't say "no diagnostic
required" or "undefined behavior". I read 1.4 <a href="intro.html#intro.compliance">[intro.compliance]</a>, paragraph 1, to mean that a diagnostic is required.
It's not clear whether this requirement was intended.  While it's
possible to provide such a diagnostic, the extra complication doesn't
seem to add any value.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Change 18.1, paragraph 5, to "If <i>type</i> is not a POD
structure or a POD union the results are undefined."</p>
<hr>
        <a name="307">
            <h3>307.&nbsp;Lack of reference typedefs in container adaptors</h3>
        </a>
        <p>
            <b>Section:</b> 23.2.3 <a href="lib-containers.html#lib.container.adaptors">[lib.container.adaptors]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Howard Hinnant <b>Date:</b>&nbsp;13 Mar 2001</p>

<p>From reflector message c++std-lib-8330.  See also lib-8317.</p>

<p>
The standard is currently inconsistent in 23.2.3.2 <a href="lib-containers.html#lib.priority.queue">[lib.priority.queue]</a>
paragraph 1 and 23.2.3.3 <a href="lib-containers.html#lib.stack">[lib.stack]</a> paragraph 1.
23.2.3.3/1, for example, says:
</p>

<blockquote>
-1- Any sequence supporting operations back(), push_back() and pop_back() 
can be used to instantiate stack. In particular, vector (lib.vector), list 
(lib.list) and deque (lib.deque) can be used. 
</blockquote>

<p>But this is false: vector&lt;bool&gt; can not be used, because the
container adaptors return a T&amp; rather than using the underlying
container's reference type.</p>

<p>This is a contradiction that can be fixed by:</p>

<ol>
<li>Modifying these paragraphs to say that vector&lt;bool&gt;
    is an exception.</li>
<li>Removing the vector&lt;bool&gt; specialization.</li>
<li>Changing the return types of stack and priority_queue to use 
    reference typedef's.</li>
</ol>

<p>
I propose 3.  This does not preclude option 2 if we choose to do it
later (see issue <a href="lwg-active.html#96">96</a>); the issues are independent.  Option
3 offers a small step towards support for proxied containers.  This
small step fixes a current contradiction, is easy for vendors to
implement, is already implemented in at least one popular lib, and
does not break any code.
</p>

<p>
            <b>Proposed resolution:</b>
        </p>
<p>Summary: Add reference and const_reference typedefs to queue,
priority_queue and stack.  Change return types of "value_type&amp;" to
"reference".  Change return types of "const value_type&amp;" to
"const_reference".  Details:</p>

<p>Change 23.2.3.1/1 from:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = deque&lt;T&gt; &gt;
    class queue {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;

    public:
      explicit queue(const Container&amp; = Container());

      bool      empty() const             { return c.empty(); }
      size_type size()  const             { return c.size(); }
      value_type&amp;       front()           { return c.front(); }
      const value_type&amp; front() const     { return c.front(); }
      value_type&amp;       back()            { return c.back(); }
      const value_type&amp; back() const      { return c.back(); }
      void push(const value_type&amp; x)      { c.push_back(x); }
      void pop()                          { c.pop_front(); }
    };
</pre>

<p>to:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = deque&lt;T&gt; &gt;
    class queue {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::reference             reference;
      typedef typename Container::const_reference       const_reference;
      typedef typename Container::value_type            value_type;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;

    public:
      explicit queue(const Container&amp; = Container());

      bool      empty() const             { return c.empty(); }
      size_type size()  const             { return c.size(); }
      reference         front()           { return c.front(); }
      const_reference   front() const     { return c.front(); }
      reference         back()            { return c.back(); }
      const_reference   back() const      { return c.back(); }
      void push(const value_type&amp; x)      { c.push_back(x); }
      void pop()                          { c.pop_front(); }
    };
</pre>

<p>Change 23.2.3.2/1 from:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = vector&lt;T&gt;,
              class Compare = less&lt;typename Container::value_type&gt; &gt;
    class priority_queue {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;
      Compare comp;

    public:
      explicit priority_queue(const Compare&amp; x = Compare(),
                              const Container&amp; = Container());
      template &lt;class InputIterator&gt;
        priority_queue(InputIterator first, InputIterator last,
                       const Compare&amp; x = Compare(),
                       const Container&amp; = Container());

      bool      empty() const       { return c.empty(); }
      size_type size()  const       { return c.size(); }
      const value_type&amp; top() const { return c.front(); }
      void push(const value_type&amp; x);
      void pop();
    };
                                  //  no equality is provided
  }
</pre>

<p>to:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = vector&lt;T&gt;,
              class Compare = less&lt;typename Container::value_type&gt; &gt;
    class priority_queue {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::reference             reference;
      typedef typename Container::const_reference       const_reference;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;
      Compare comp;

    public:
      explicit priority_queue(const Compare&amp; x = Compare(),
                              const Container&amp; = Container());
      template &lt;class InputIterator&gt;
        priority_queue(InputIterator first, InputIterator last,
                       const Compare&amp; x = Compare(),
                       const Container&amp; = Container());

      bool      empty() const       { return c.empty(); }
      size_type size()  const       { return c.size(); }
      const_reference   top() const { return c.front(); }
      void push(const value_type&amp; x);
      void pop();
    };
                                  //  no equality is provided
  }
</pre>

<p>And change 23.2.3.3/1 from:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = deque&lt;T&gt; &gt;
    class stack {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;

    public:
      explicit stack(const Container&amp; = Container());

      bool      empty() const             { return c.empty(); }
      size_type size()  const             { return c.size(); }
      value_type&amp;       top()             { return c.back(); }
      const value_type&amp; top() const       { return c.back(); }
      void push(const value_type&amp; x)      { c.push_back(x); }
      void pop()                          { c.pop_back(); }
    };

    template &lt;class T, class Container&gt;
      bool operator==(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&lt; (const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator!=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&gt; (const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&gt;=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&lt;=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
  }
</pre>

<p>to:</p>

<pre>
  namespace std {
    template &lt;class T, class Container = deque&lt;T&gt; &gt;
    class stack {
    public:
      typedef typename Container::value_type            value_type;
      typedef typename Container::reference             reference;
      typedef typename Container::const_reference       const_reference;
      typedef typename Container::size_type             size_type;
      typedef          Container                        container_type;
    protected:
      Container c;

    public:
      explicit stack(const Container&amp; = Container());

      bool      empty() const             { return c.empty(); }
      size_type size()  const             { return c.size(); }
      reference         top()             { return c.back(); }
      const_reference   top() const       { return c.back(); }
      void push(const value_type&amp; x)      { c.push_back(x); }
      void pop()                          { c.pop_back(); }
    };

    template &lt;class T, class Container&gt;
      bool operator==(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&lt; (const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator!=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&gt; (const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&gt;=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
    template &lt;class T, class Container&gt;
      bool operator&lt;=(const stack&lt;T, Container&gt;&amp; x,
                      const stack&lt;T, Container&gt;&amp; y);
  }
</pre>
<hr>
        <a name="308">
            <h3>308.&nbsp;Table 82 mentions unrelated headers</h3>
        </a>
        <p>
            <b>Section:</b> 27 <a href="lib-iostreams.html#lib.input.output">[lib.input.output]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;15 Mar 2001</p>
<p>
Table 82 in section 27 mentions the header &lt;cstdlib&gt; for String
streams (27.7 <a href="lib-iostreams.html#lib.string.streams">[lib.string.streams]</a>) and the headers &lt;cstdio&gt; and
&lt;cwchar&gt; for File streams (27.8 <a href="lib-iostreams.html#lib.file.streams">[lib.file.streams]</a>). It's not clear
why these headers are mentioned in this context since they do not
define any of the library entities described by the
subclauses. According to 17.4.1.1 <a href="lib-intro.html#lib.contents">[lib.contents]</a>, only such headers
are to be listed in the summary.
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Remove &lt;cstdlib&gt;, &lt;cstdio&gt; and &lt;cwchar&gt; from
Table 82.</p>
<hr>
        <a name="309">
            <h3>309.&nbsp;Does sentry catch exceptions?</h3>
        </a>
        <p>
            <b>Section:</b> 27.6 <a href="lib-iostreams.html#lib.iostream.format">[lib.iostream.format]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Martin Sebor <b>Date:</b>&nbsp;19 Mar 2001</p>
<p>
The descriptions of the constructors of basic_istream&lt;&gt;::sentry
(27.6.1.1.2 <a href="lib-iostreams.html#lib.istream::sentry">[lib.istream::sentry]</a>) and basic_ostream&lt;&gt;::sentry
(27.6.2.3 <a href="lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</a>) do not explain what the functions do in
case an exception is thrown while they execute. Some current
implementations allow all exceptions to propagate, others catch them
and set ios_base::badbit instead, still others catch some but let
others propagate.
</p>

<p>
The text also mentions that the functions may call setstate(failbit)
(without actually saying on what object, but presumably the stream
argument is meant).  That may have been fine for
basic_istream&lt;&gt;::sentry prior to issue <a href="lwg-defects.html#195">195</a>, since
the function performs an input operation which may fail. However,
issue <a href="lwg-defects.html#195">195</a> amends 27.6.1.1.2 <a href="lib-iostreams.html#lib.istream::sentry">[lib.istream::sentry]</a>, p2 to
clarify that the function should actually call setstate(failbit |
eofbit), so the sentence in p3 is redundant or even somewhat
contradictory.
</p>

<p>
The same sentence that appears in 27.6.2.3 <a href="lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</a>, p3
doesn't seem to be very meaningful for basic_istream&lt;&gt;::sentry
which performs no input. It is actually rather misleading since it
would appear to guide library implementers to calling
setstate(failbit) when os.tie()-&gt;flush(), the only called function,
throws an exception (typically, it's badbit that's set in response to
such an event).
</p>
<p>
            <b>Proposed resolution:</b>
        </p>
<p>Add the following paragraph immediately after 
<font color="red">27.06.02.01.03</font>, p5</p>

<blockquote>
    <p>
    If an exception is thrown during the preparation then ios::badbit
    is turned on* in is's error state.
    </p>

    <p>
    [Footnote: This is done without causing an ios::failure to be thrown.
    --- end footnote]
    </p>

    <p>
    If (is.exceptions() &amp; ios_base::badbit)!= 0 then the exception is
    rethrown.
    </p>
</blockquote>

<p>And strike the following sentence from <font color="red">27.06.02.01.03</font>, p5</p>

<blockquote>
    During preparation, the constructor may call setstate(failbit)
    (which may throw ios_base::failure (lib.iostate.flags))
</blockquote>

<p>Add the following paragraph immediately after 
27.6.2.3 <a href="lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</a>, p3</p>

<blockquote>
    <p>
    If an exception is thrown during the preparation then ios::badbit
    is turned on* in os's error state.
    </p>

    <p>
    [Footnote: This is done without causing an ios::failure to be
    thrown.  --- end footnote]
    </p>

    <p>
    If (os.exceptions() &amp; ios_base::badbit)!= 0 then the exception
    is rethrown.
    </p>
</blockquote>

<p>And strike the following sentence from 27.6.2.3 <a href="lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</a>, p3</p>

<blockquote>
    During preparation, the constructor may call setstate(failbit)
    (which may throw ios_base::failure (lib.iostate.flags))
</blockquote>

<p>(Note that the removal of the two sentences means that the ctors
will not be able to report the failure of any implementation-dependent
operations referred to in footnotes 280 and 293, unless such
operations throw an exception.)</p>
<hr>
        <a name="310">
            <h3>310.&nbsp;Is errno a macro?</h3>
        </a>
        <p>
            <b>Section:</b> 17.4.1.2 <a href="lib-intro.html#lib.headers">[lib.headers]</a>, 19.3 <a href="lib-diagnostics.html#lib.errno">[lib.errno]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Steve Clamage <b>Date:</b>&nbsp;21 Mar 2001</p>
  <p>
  Exactly how should errno be declared in a conforming C++ header?
  </p>

  <p>
  The C standard says in 7.1.4 that is is unspecified whether errno is a
  macro or an identifier with external linkage.  In some implementations
  it can be either, depending on compile-time options.  (E.g., on
  Solaris in multi-threading mode, errno is a macro that expands to a
  function call, but is an extern int otherwise.  "Unspecified" allows
  such variability.)
  </p>

  <p>The C++ standard:</p>
  <ul>
  <li>17.4.1.2 says in a note that errno must be macro in C. (false)</li>
  <li>17.4.3.1.3 footnote 166 says errno is reserved as an external 
      name (true), and implies that it is an identifier.</li>
  <li>19.3 simply lists errno as a macro (by what reasoning?) and goes
      on to say that the contents of of C++ &lt;errno.h&gt; are the
      same as in C, begging the question.</li>
  <li>C.2, table 95 lists errno as a macro, without comment.</li>
  </ul>

  <p>I find no other references to errno.</p>

  <p>We should either explicitly say that errno must be a macro, even
  though it need not be a macro in C, or else explicitly leave it
  unspecified.  We also need to say something about namespace std. 
  A user who includes &lt;cerrno&gt; needs to know whether to write
  <tt>errno</tt>, or <tt>::errno</tt>, or <tt>std::errno</tt>, or
  else &lt;cerrno&gt; is useless.</p>

  <p>Two acceptable fixes:</p>
  <ul>
    <li>
                <p>errno must be a macro. This is trivially satisfied by adding<br>
        &nbsp;&nbsp;#define errno (::std::errno)<br>
        to the headers if errno is not already a macro. You then always
        write errno without any scope qualification, and it always expands
        to a correct reference. Since it is always a macro, you know to
        avoid using errno as a local identifer.</p>
            </li>
    <li>
                <p>errno is in the global namespace. This fix is inferior, because
        ::errno is not guaranteed to be well-formed.</p>
            </li>
  </ul>

  <p>
            <i>[
    This issue was first raised in 1999, but it slipped through 
    the cracks.
  ]</i>
        </p>
<p>
            <b>Proposed resolution:</b>
        </p>
        <hr>
        <a name="311">
            <h3>311.&nbsp;Incorrect wording in basic_ostream class synopsis</h3>
        </a>
        <p>
            <b>Section:</b> 27.6.2.1 <a href="lib-iostreams.html#lib.ostream">[lib.ostream]</a>
  &nbsp;
<b>Status:</b>&nbsp;
   <a href="#New">New</a>
   
   
     
       &nbsp;
   <b>Submitter:</b>&nbsp;Andy Sawyer <b>Date:</b>&nbsp;21 Mar 2001</p>

<p>In 27.6.2.1 <a href="lib-iostreams.html#lib.ostream">[lib.ostream]</a>, the synopsis of class basic_ostream says:</p>

<pre>
  // partial specializationss
  template&lt;class traits&gt;
    basic_ostream&lt;char,traits&gt;&amp; operator&lt;&lt;( basic_ostream&lt;char,traits&gt;&amp;,
                                            const char * );
</pre>

<p>Problems:</p>
<ul>
<li>Too many 's's at the end of "specializationss" </li>
<li>This is an overload, not a partial specialization</li>
</ul>

<p>
            <b>Proposed resolution:</b>
        </p>
     ----- End of document -----
    </body>
</html>
