<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML><HEAD><TITLE>C++ Standard Library Active Issues List</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff>
<TABLE>
  <TBODY>
  <TR>
    <TD align=left>Doc. no.</TD>
    <TD align=left>N1684=04-0124</TD></TR>
  <TR>
    <TD align=left>Date:</TD>
    <TD align=left>10 Sep 2004</TD></TR>
  <TR>
    <TD align=left>Project:</TD>
    <TD align=left>Programming Language C++</TD></TR>
  <TR>
    <TD align=left>Reply to:</TD>
    <TD align=left>Matt Austern &lt;austern@apple.com&gt;</TD></TR></TBODY></TABLE>
<H1>C++ Standard Library Active Issues List (Revision 32)</H1>
<P>Reference ISO/IEC IS 14882:1998(E)</P>
<P>Also see:</P>
<UL>
  <LI><A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-toc.html">Table 
  of Contents</A> for all library issues. 
  <LI><A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-index.html">Index 
  by Section</A> for all library issues. 
  <LI><A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-status.html">Index 
  by Status</A> for all library issues. 
  <LI><A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html">Library 
  Defect Reports List</A> 
  <LI><A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>, 
<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>, 
<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>, 
and <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>. 
See <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html">Library 
Defect Reports List</A> for issues considered defects and <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html">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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#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 official version of this document see <A 
href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/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 
comp.std.c++ FAQ. 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>R32: 2004-09 pre-Redmond mailing: reflects new proposed resolutions and 
  new issues received after the 2004-07 mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#479">479</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#481">481</A>. 

  <LI>R31: 2004-07 mid-term mailing: reflects new proposed resolutions and new 
  issues received after the post-Sydney mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#463">463</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#478">478</A>. 

  <LI>R30: Post-Sydney mailing: reflects decisions made at the Sydney meeting. 
  Voted all "Ready" issues from R29 into the working paper. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#460">460</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#462">462</A>. 

  <LI>R29: Pre-Sydney mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#441">441</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#457">457</A>. 

  <LI>R28: Post-Kona mailing: reflects decisions made at the Kona meeting. Added 
  new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#432">432</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#440">440</A>. 

  <LI>R27: Pre-Kona mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#404">404</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#431">431</A>. 

  <LI>R26: Post-Oxford mailing: reflects decisions made at the Oxford meeting. 
  All issues in Ready status were voted into DR status. All issues in DR status 
  were voted into WP status. 
  <LI>R25: Pre-Oxford mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#390">390</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#402">402</A>. 

  <LI>R24: Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz 
  meeting. All Ready issues from R23 with the exception of <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#253">253</A>, 
  which has been given a new proposed resolution, were moved to DR status. Added 
  new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#383">383</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#389">389</A>. 
  (Issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#387">387</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#389">389</A> 
  were discussed at the meeting.) Made progress on issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#225">225</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#226">226</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#229">229</A>: 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#225">225</A> 
  and <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#229">229</A> 
  have been moved to Ready status, and the only remaining concerns with <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#226">226</A> 
  involve wording. 
  <LI>R23: Pre-Santa Cruz mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#367">367</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#382">382</A>. 
  Moved issues in the TC to TC status. 
  <LI>R22: Post-Curaao mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#362">362</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#366">366</A>. 

  <LI>R21: Pre-Curaao mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#351">351</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#361">361</A>. 

  <LI>R20: Post-Redmond mailing; reflects actions taken in Redmond. Added new 
  issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#336">336</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#350">350</A>, 
  of which issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#347">347</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#350">350</A> 
  were added since Redmond, hence not discussed at the meeting. All Ready issues 
  were moved to DR status, with the exception of issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#284">284</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#241">241</A>, 
  and <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#267">267</A>. 
  Noteworthy issues discussed at Redmond include <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#120">120</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#202">202</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#226">226</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#233">233</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#270">270</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#253">253</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#254">254</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#323">323</A>. 

  <LI>R19: Pre-Redmond mailing. Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#323">323</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#335">335</A>. 

  <LI>R18: Post-Copenhagen mailing; reflects actions taken in Copenhagen. Added 
  new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#312">312</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#317">317</A>, 
  and discussed new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#271">271</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#314">314</A>. 
  Changed status of issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#103">103</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#118">118</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#136">136</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#153">153</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#165">165</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#171">171</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#183">183</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#184">184</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#185">185</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#186">186</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#214">214</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#221">221</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#234">234</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#237">237</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#243">243</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#248">248</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#251">251</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#252">252</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#256">256</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#260">260</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#261">261</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#262">262</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#263">263</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#265">265</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#268">268</A> 
  to DR. Changed status of issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#49">49</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#109">109</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#117">117</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#182">182</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#228">228</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#230">230</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#232">232</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#235">235</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#238">238</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#241">241</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#242">242</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#250">250</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#259">259</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#264">264</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#266">266</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#267">267</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#271">271</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#272">272</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#273">273</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#275">275</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#281">281</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#284">284</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#285">285</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#286">286</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#288">288</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#292">292</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#295">295</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#297">297</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#298">298</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#301">301</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#303">303</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#306">306</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#307">307</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#308">308</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#312">312</A> 
  to Ready. Closed issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#111">111</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#277">277</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#279">279</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#287">287</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#289">289</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#293">293</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#302">302</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#313">313</A> 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#314">314</A> 
  as NAD. 
  <LI>R17: Pre-Copenhagen mailing. Converted issues list to XML. Added proposed 
  resolutions for issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#49">49</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#76">76</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#91">91</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#235">235</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#250">250</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#267">267</A>. 
  Added new issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#278">278</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#311">311</A>. 

  <LI>R16: post-Toronto mailing; reflects actions taken in Toronto. Added new 
  issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#265">265</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#277">277</A>. 
  Changed status of issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#3">3</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#8">8</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#9">9</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#19">19</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#26">26</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#31">31</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#61">61</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#63">63</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#86">86</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#108">108</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#112">112</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#114">114</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#115">115</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#122">122</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#127">127</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#129">129</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#134">134</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#137">137</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#142">142</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#144">144</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#146">146</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#147">147</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#159">159</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#164">164</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#170">170</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#181">181</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#199">199</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#208">208</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#209">209</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#210">210</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#211">211</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#212">212</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#217">217</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#220">220</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#222">222</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#223">223</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#224">224</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#227">227</A> 
  to "DR". Reopened issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#23">23</A>. 
  Reopened issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#187">187</A>. 
  Changed issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#2">2</A> 
  and <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#4">4</A> 
  to NAD. Fixed a typo in issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#17">17</A>. 
  Fixed issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#70">70</A>: 
  signature should be changed both places it appears. Fixed issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#160">160</A>: 
  previous version didn't fix the bug in enough places. 
  <LI>R15: pre-Toronto mailing. Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#233">233</A>-<A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#264">264</A>. 
  Some small HTML formatting changes so that we pass Weblint tests. 
  <LI>R14: post-Tokyo II mailing; reflects committee actions taken in Tokyo. 
  Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#228">228</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#232">232</A>. 
  (00-0019R1/N1242) 
  <LI>R13: pre-Tokyo II updated: Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#212">212</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#227">227</A>. 

  <LI>R12: pre-Tokyo II mailing: Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#199">199</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#211">211</A>. 
  Added "and paragraph 5" to the proposed resolution of issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#29">29</A>. 
  Add further rationale to issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#178">178</A>. 

  <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#4">4</A> 
  and <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#38">38</A>. 
  Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#196">196</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#198">198</A>. 
  Closed issues list split into "defects" and "closed" documents. Changed the 
  proposed resolution of issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#4">4</A> 
  to NAD, and changed the wording of proposed resolution of issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#38">38</A>. 

  <LI>R10: pre-Kona updated. Added proposed resolutions <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#83">83</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#86">86</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#91">91</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#92">92</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#109">109</A>. 
  Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#190">190</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#195">195</A>. 
  (99-0033/D1209, 14 Oct 99) 
  <LI>R9: pre-Kona mailing. Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#140">140</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#189">189</A>. 
  Issues list split into separate "active" and "closed" documents. 
  (99-0030/N1206, 25 Aug 99) 
  <LI>R8: post-Dublin mailing. Updated to reflect LWG and full committee actions 
  in Dublin. (99-0016/N1193, 21 Apr 99) 
  <LI>R7: pre-Dublin updated: Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#130">130</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#131">131</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#132">132</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#133">133</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#134">134</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#135">135</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#136">136</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#137">137</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#138">138</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#139">139</A> 
  (31 Mar 99) 
  <LI>R6: pre-Dublin mailing. Added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#127">127</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#128">128</A>, 
  and <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#129">129</A>. 
  (99-0007/N1194, 22 Feb 99) 
  <LI>R5: update issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#103">103</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#112">112</A>; 
  added issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#114">114</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#126">126</A>. 
  Format revisions to prepare for making list public. (30 Dec 98) 
  <LI>R4: post-Santa Cruz II updated: Issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#110">110</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#111">111</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#112">112</A>, 
  <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#113">113</A> 
  added, several issues corrected. (22 Oct 98) 
  <LI>R3: post-Santa Cruz II: Issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#94">94</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#109">109</A> 
  added, many issues updated to reflect LWG consensus (12 Oct 98) 
  <LI>R2: pre-Santa Cruz II: Issues <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#73">73</A> 
  to <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#93">93</A> 
  added, issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#17">17</A> 
  updated. (29 Sep 98) 
  <LI>R1: Correction to issue <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#55">55</A> 
  resolution, <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#60">60</A> 
  code format, <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#64">64</A> 
  title. (17 Sep 98) </LI></UL>
<H2><A name=Status></A>Issue Status</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><B><A name=Open>Open</A></B> - 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>Informal consensus may have been reached, but the LWG awaits exact 
  <B>Proposed Resolution</B> wording for review. 
  <LI>The LWG wishes to consult additional technical experts before proceeding. 
  <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> identifies the duplicated issue's issue number. </P>
<P><B><A name=NAD>NAD</A></B> - 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><B><A name=Review>Review</A></B> - 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><B><A name=Ready>Ready</A></B> - 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><B><A name=DR>DR</A></B> - (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><B><A name=WP>WP</A></B> - (Working Paper) - The proposed resolution has not 
been accepted as a Technical Corrigendum, but the full WG21 committee has voted 
to apply the Defect Report's Proposed Resolution to the working paper.</P>
<P><B><A name=RR>RR</A></B> - (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><B><A name=Future>Future</A></B> - 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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A> 
when they first appear on the issues list. They may progress to <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A> 
or <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Dup">Dup</A>, 
<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#NAD">NAD</A>, 
or <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#DR">DR</A>). 
These in turn may become the basis for Technical Corrigenda (<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#TC">TC</A>), 
or are closed without action other than a Record of Response (<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#RR">RR</A> 
). 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>Active Issues</H2>
<HR>
<A name=23>
<H3>23.&nbsp;Num_get overflow result</H3></A>
<P><B>Section:</B>&nbsp;22.2.2.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Nathan Myers&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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><TT>scanf()</TT> is defined in terms of <TT>fscanf()</TT>. 
  <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>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>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>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><B>Further discussion from Redmond:</B></P>
<P>The basic problem is that we've defined our behavior, including our 
error-reporting behavior, in terms of C90. However, C90's method of reporting 
overflow in scanf is not technically an "input error". The <TT>strto_*</TT> 
functions are more precise.</P>
<P>There was general consensus that <TT>failbit</TT> should be set upon 
overflow. We considered three options based on this:</P>
<OL>
  <LI>Set failbit upon conversion error (including overflow), and don't store 
  any value. 
  <LI>Set failbit upon conversion error, and also set <TT>errno</TT> to 
  indicated the precise nature of the error. 
  <LI>Set failbit upon conversion error. If the error was due to overflow, store 
  +-numeric_limits&lt;T&gt;::max() as an overflow indication. </LI></OL>
<P>Straw poll: (1) 5; (2) 0; (3) 8.</P>
<P><B>Further discussion from Santa Cruz:</B></P>
<P>There was some discussion of what the intent of our error reporting mechanism 
was. There was general agreement on the following principles:</P>
<UL>
  <LI>We want to convert strings to numbers in the same way as the C 
  <TT>strto*</TT> functions do. The same things that those functions would 
  consider errors, we consider errors. 
  <LI>Overflow is an error. Floating-point underflow is not an error. 
  1.e-9999999, for example, should be treated as 0. (A negative number whose 
  magnitude is too large is still overflow, and is just the same error as a 
  positive number whose magnitude is too large. Finally, <TT>strtoul</TT> 
  already specifies what happens if you try to convert a sequence beginning with 
  a minus sign into an unsigned value.) 
  <LI>Our mechanism for reporting errors is to set failbit. Our mechanism is not 
  errno. Nothing in the standard should require or imply that streams or facets 
  ever set errno. (Even if some implementations might have that effect.) 
</LI></UL>
<P>The crux of the disagreement was that some people, but not all, believed that 
the design was also based on a fourth principle: whenever converstion fails and 
failbit is set, nothing is to be extracted and the value of the variable being 
extracted into is guaranteed to be unchanged.</P>
<P>Some people believe that upon overflow, an implementation should "extract" a 
special value that allows the user to tell that it was overflow instead of some 
other kind of error. Straw poll: 1 person believed the standard should require 
that, 2 thought it should forbid it, and 6 thought the standard should allow but 
not require it.</P>
<P><B>Proposed resolution:</B></P>
<P>typo: 22.2.2.2.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.facet.num.put.virtuals">[lib.facet.num.put.virtuals]</A>, 
para 2, bullet 3. Strike "in." from the end.</P>
<P>Change 22.2.2.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.nm.put">[lib.locale.nm.put]</A>, 
para 11, bullet 2 from:</P>
<BLOCKQUOTE>The sequence of chars accumulated in stage 2 would have caused 
  scanf to report an input failure. ios_base::failbit is assigned to err. 
</BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>The sequence of chars accumulated in stage 2 would have caused 
  scanf to report an input failure or to store a value outside the range 
  representable by val. ios_base::failbit is assigned to err. </BLOCKQUOTE>
<P><I>[PJP provided wording. this treats overflow or underflow the same as an 
ill-formed field. It's not exactly the consensus from Santa Cruz, but he thinks 
it's the simplest and most robust rule and that it corresponds to widespread 
common practice.]</I></P>
<P><I>[Kona: Wording here still isn't quite right, partly because it refers to 
scanf and the scanf description of error conditions is murky. The LWG had to do 
a very close reading of scanf in an attempt to figure out what this proposed 
resolution means. General agreement that the correct solution: (1) should not 
refer to scanf behavior, (2) should not set errno, (3) should allow users who 
care to figure out what kind of error happened. Martin will provide wording, 
Howard may help.]</I></P>
<HR>
<A name=96>
<H3>96.&nbsp;Vector&lt;bool&gt; is not a container</H3></A>
<P><B>Section:</B>&nbsp;23.2.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector.bool">[lib.vector.bool]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;AFNOR&nbsp; <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=130>
<H3>130.&nbsp;Return type of container::erase(iterator) differs for associative 
containers</H3></A>
<P><B>Section:</B>&nbsp;23.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</A>, 
23.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.sequence.reqmts">[lib.sequence.reqmts]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andrew Koenig&nbsp; <B>Date:</B>&nbsp;2 Mar 1999</P>
<P>Table 67 (23.1.1) says that container::erase(iterator) returns an iterator. 
Table 69 (23.1.2) says that in addition to this requirement, associative 
containers also say that container::erase(iterator) returns void. That's not an 
addition; it's a change to the requirements, which has the effect of making 
associative containers fail to meet the requirements for containers.</P>
<P><B>Proposed resolution:</B></P>
<P>In 23.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</A>, 
in Table 69 Associative container requirements, change the return type of 
<TT>a.erase(q)</TT> from <TT>void</TT> to <TT>iterator</TT>. Change the 
assertion/not/pre/post-condition from "erases the element pointed to by 
<TT>q</TT>" to "erases the element pointed to by <TT>q</TT>. Returns an iterator 
pointing to the element immediately following q prior to the element being 
erased. If no such element exists, a.end() is returned." </P>
<P>In 23.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</A>, 
in Table 69 Associative container requirements, change the return type of 
<TT>a.erase(q1, q2)</TT> from <TT>void</TT> to <TT>iterator</TT>. Change the 
assertion/not/pre/post-condition from "erases the elements in the range <TT>[q1, 
q2)</TT>" to "erases the elements in the range <TT>[q1, q2)</TT>. Returns an 
iterator pointing to the element immediately following q2 prior to any elements 
being erased. If no such element exists, a.end() is returned." </P>
<P>In 23.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.map">[lib.map]</A>, 
in the <TT>map</TT> class synopsis; and in 23.3.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.multimap">[lib.multimap]</A>, 
in the <TT>multimap</TT> class synopsis; and in 23.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.set">[lib.set]</A>, 
in the <TT>set</TT> class synopsis; and in 23.3.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.multiset">[lib.multiset]</A>, 
in the <TT>multiset</TT> class synopsis: change the signature of the first 
<TT>erase</TT> overload to </P><PRE>   iterator erase(iterator position);
</PRE>
<P><I>[Pre-Kona: reopened at the request of Howard Hinnant]</I></P>
<P><I>[Post-Kona: the LWG agrees the return type should be <TT>iterator</TT>, 
not <TT>void</TT>. (Alex Stepanov agrees too.) Matt provided wording.]</I></P>
<P><I>[ Sydney: the proposed wording went in the right direction, but it wasn't 
good enough. We want to return an iterator from the range form of erase as well 
as the single-iterator form. Also, the wording is slightly different from the 
wording we have for sequences; there's no good reason for having a difference. 
Matt provided new wording, which we will review at the next meeting. ]</I></P>
<HR>
<A name=197>
<H3>197.&nbsp;max_size() underspecified</H3></A>
<P><B>Section:</B>&nbsp;20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A>, 
23.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.container.requirements">[lib.container.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andy Sawyer&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/expr.html#expr.const">[expr.const]</A>) 
that could ever meaningfully be passed to X::allocate</P>
<P>Change 23.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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>[Copenhagen: Exactly what <TT>max_size</TT> means is still unclear. It may 
have a different meaning as a container member function than as an allocator 
member function. For the latter, it is probably best thought of as an 
architectural limit. Nathan will provide new wording.]</I></P>
<HR>
<A name=201>
<H3>201.&nbsp;Numeric limits terminology wrong</H3></A>
<P><B>Section:</B>&nbsp;18.2.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-support.html#lib.limits">[lib.limits]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Stephen Cleary&nbsp; <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=233>
<H3>233.&nbsp;Insertion hints in associative containers</H3></A>
<P><B>Section:</B>&nbsp;23.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andrew Koenig&nbsp; <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>Additional comments from Nathan:</B><BR>The vote [in Redmond] was on 
whether to elaborately specify the use of the hint, or to require behavior only 
if the value could be inserted adjacent to the hint. I would like to ensure that 
we have a chance to vote for a deterministic treatment: "before, if possible, 
otherwise after, otherwise anywhere appropriate", as an alternative to the 
proposed "before or after, if possible, otherwise [...]". </P>
<P><B>Proposed resolution:</B></P>
<P>In table 69 "Associative Container Requirements" in 23.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.associative.reqmts">[lib.associative.reqmts]</A>, 
in the row for <TT>a.insert(p, t)</TT>, change</P>
<BLOCKQUOTE>iterator p is a hint pointing to where the insert should start to 
  search. </BLOCKQUOTE>
<P>to</P>
<BLOCKQUOTE>insertion adjacent to iterator p is preferred if more than one 
  insertion point is valid. </BLOCKQUOTE>
<P>and change</P>
<BLOCKQUOTE>logarithmic in general, but amortized constant if t is inserted 
  right after p. </BLOCKQUOTE>
<P>to</P>
<BLOCKQUOTE>logarithmic in general, but amortized constant if t is inserted 
  adjacent to iterator 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. The proposed 
resolution was that the new element should always be inserted as close to the 
hint as possible. So, for example, if there is a subsequence of equivalent 
values, then providing a.begin() as the hint means that the new element should 
be inserted before the subsequence even if a.begin() is far away. JC van Winkel 
supplied precise wording for this proposed resolution, and also for an 
alternative resolution in which hints are only used when they are adjacent to 
the insertion point.]</I></P>
<P><I>[Copenhagen: the LWG agreed to the original proposed resolution, in which 
an insertion hint would be used even when it is far from the insertion point. 
This was contingent on seeing a reference implementation showing that it is 
possible to implement this requirement without loss of efficiency. John Potter 
provided such a reference implementation.]</I></P>
<P><I>[Redmond: The LWG was reluctant to adopt the proposal that emerged from 
Copenhagen: it seemed excessively complicated, and went beyond fixing the defect 
that we identified in Toronto. PJP provided the new wording described in this 
issue. Nathan agrees that we shouldn't adopt the more detailed semantics, and 
notes: "we know that you can do it efficiently enough with a red-black tree, but 
there are other (perhaps better) balanced tree techniques that might differ 
enough to make the detailed semantics hard to satisfy."]</I></P>
<P><I>[Curaao: Nathan should give us the alternative wording he suggests so the 
LWG can decide between the two options.]</I></P>
<HR>
<A name=247>
<H3>247.&nbsp;<TT>vector</TT>, <TT>deque::insert</TT> complexity</H3></A>
<P><B>Section:</B>&nbsp;23.2.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector.modifiers">[lib.vector.modifiers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Lisa Lippincott&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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=254>
<H3>254.&nbsp;Exception types in clause 19 are constructed from 
<TT>std::string</TT> </H3></A>
<P><B>Section:</B>&nbsp;19.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-diagnostics.html#lib.std.exceptions">[lib.std.exceptions]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <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>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><B>Further discussion, in email:</B></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>Further discussion, from Redmond:</B></P>
<P>The most important progress we made at the Redmond meeting was realizing that 
there are two separable issues here: the const string&amp; constructor, and the 
copy constructor. If a user writes something like <TT>throw 
std::out_of_range("foo")</TT>, the const string&amp; constructor is invoked 
before anything gets thrown. The copy constructor is potentially invoked during 
stack unwinding.</P>
<P>The copy constructor is a more serious problem, becuase failure during stack 
unwinding invokes <TT>terminate</TT>. The copy constructor must be nothrow. 
<I>Curaao: Howard thinks this requirement is already present.</I></P>
<P>The fundamental problem is that it's difficult to get the nothrow requirement 
to work well with the requirement that the exception objects store a string of 
unbounded size, particularly if you also try to make the const string&amp; 
constructor nothrow. Options discussed include:</P>
<UL>
  <LI>Limit the size of a string that exception objects are required to throw: 
  change the postconditions of 19.1.2 <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-diagnostics.html#lib.domain.error">[lib.domain.error]</A> 
  paragraph 3 and 19.1.6 <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-diagnostics.html#lib.runtime.error">[lib.runtime.error]</A> 
  paragraph 3 to something like this: "strncmp(what(), what_arg._str(), N) == 0, 
  where N is an implementation defined constant no smaller than 256". 
  <LI>Allow the const string&amp; constructor to throw, but not the copy 
  constructor. It's the implementor's responsibility to get it right. (An 
  implementor might use a simple refcount class.) 
  <LI>Compromise between the two: an implementation is not allowed to throw if 
  the string's length is less than some N, but, if it doesn't throw, the string 
  must compare equal to the argument. 
  <LI>Add a new constructor that takes a const char* </LI></UL>
<P>(Not all of these options are mutually exclusive.)</P>
<P><B>Proposed resolution:</B></P>
<P><B>Rationale:</B></P>
<P>Throwing a bad_alloc while trying to construct a message for another 
exception-derived class is not necessarily a bad thing. And the bad_alloc 
constructor already has a no throw spec on it (18.4.2.1).</P>
<P>The copy constructors of all exception-derived classes already have a no 
throw spec. Reference 18.6.1, 19.1 and 15.4/13. </P>
<P><B>Future:</B></P>
<P>All involved would like to see const char* constructors added, but this 
should probably be done for C++0X as opposed to a DR.</P>
<P>I believe the no throw specs currently decorating these functions could be 
improved by some kind of static no throw spec checking mechanism (in a future 
C++ language). As they stand, the copy constructors might fail via a call to 
unexpected. I think what is intended here is that the copy constructors can't 
fail.</P>
<P><I>[Pre-Sydney: reopened at the request of Howard Hinnant.]</I></P>
<HR>
<A name=258>
<H3>258.&nbsp;Missing allocator requirement</H3></A>
<P><B>Section:</B>&nbsp;20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Matt Austern&nbsp; <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=280>
<H3>280.&nbsp;Comparison of reverse_iterator to const reverse_iterator</H3></A>
<P><B>Section:</B>&nbsp;24.4.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.reverse.iterators">[lib.reverse.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Steve Cleary&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.reverse.iter.ops">[lib.reverse.iter.ops]</A>. 
</P>
<P><I>[ Copenhagen: The LWG is concerned that the proposed resolution introduces 
new overloads. Experience shows that introducing overloads is always risky, and 
that it would be inappropriate to make this change without implementation 
experience. It may be desirable to provide this feature in a different way. 
]</I></P>
<HR>
<A name=290>
<H3>290.&nbsp;Requirements to for_each and its function object</H3></A>
<P><B>Section:</B>&nbsp;25.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.foreach">[lib.alg.foreach]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Angelika Langer&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#242">242</A>): 
</P>
<BLOCKQUOTE>-2- <B>Requires</B>: In the range [first, last], f shall not 
  invalidate iterators or subranges. </BLOCKQUOTE>
<P><I>[Copenhagen: The LWG agrees that a function object passed to an algorithm 
should not invalidate iterators in the range that the algorithm is operating on. 
The LWG believes that this should be a blanket statement in Clause 25, not just 
a special requirement for <TT>for_each</TT>. ]</I></P>
<HR>
<A name=294>
<H3>294.&nbsp;User defined macros and standard headers</H3></A>
<P><B>Section:</B>&nbsp;17.4.3.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.macro.names">[lib.macro.names]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;James Kanze&nbsp; <B>Date:</B>&nbsp;11 Jan 2001</P>
<P>Paragraph 2 of 17.4.3.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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>
<P><I>[Copenhagen: the general idea is clearly correct, but there is concern 
about making sure that the two paragraphs in 17.4.3.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.macro.names">[lib.macro.names]</A> 
remain consistent. Nathan will provide new wording.]</I></P>
<HR>
<A name=299>
<H3>299.&nbsp;Incorrect return types for iterator dereference</H3></A>
<P><B>Section:</B>&nbsp;24.1.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.bidirectional.iterators">[lib.bidirectional.iterators]</A>, 
24.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;John Potter&nbsp; <B>Date:</B>&nbsp;22 Jan 2001</P>
<P>In section 24.1.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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>Discussion from the Copenhagen meeting: the first part is uncontroversial. 
The second part, operator[] for Random Access Iterators, requires more thought. 
There are reasonable arguments on both sides. Return by value from operator[] 
enables some potentially useful iterators, e.g. a random access "iota iterator" 
(a.k.a "counting iterator" or "int iterator"). There isn't any obvious way to do 
this with return-by-reference, since the reference would be to a temporary. On 
the other hand, <TT>reverse_iterator</TT> takes an arbitrary Random Access 
Iterator as template argument, and its operator[] returns by reference. If we 
decided that the return type in Table 76 was correct, we would have to change 
<TT>reverse_iterator</TT>. This change would probably affect user code. </P>
<P>History: the contradiction between <TT>reverse_iterator</TT> and the Random 
Access Iterator requirements has been present from an early stage. In both the 
STL proposal adopted by the committee (N0527==94-0140) and the STL technical 
report (HPL-95-11 (R.1), by Stepanov and Lee), the Random Access Iterator 
requirements say that operator[]'s return value is "convertible to T". In N0527 
reverse_iterator's operator[] returns by value, but in HPL-95-11 (R.1), and in 
the STL implementation that HP released to the public, reverse_iterator's 
operator[] returns by reference. In 1995, the standard was amended to reflect 
the contents of HPL-95-11 (R.1). The original intent for operator[] is unclear. 
</P>
<P>In the long term it may be desirable to add more fine-grained iterator 
requirements, so that access method and traversal strategy can be decoupled. 
(See "Improved Iterator Categories and Requirements", N1297 = 01-0011, by Jeremy 
Siek.) Any decisions about issue 299 should keep this possibility in mind. </P>
<P>Further discussion: I propose a compromise between John Potter's resolution, 
which requires <TT>T&amp;</TT> as the return type of <TT>a[n]</TT>, and the 
current wording, which requires convertible to <TT>T</TT>. The compromise is to 
keep the convertible to <TT>T</TT> for the return type of the expression 
<TT>a[n]</TT>, but to also add <TT>a[n] = t</TT> as a valid expression. This 
compromise "saves" the common case uses of random access iterators, while at the 
same time allowing iterators such as counting iterator and caching file 
iterators to remain random access iterators (iterators where the lifetime of the 
object returned by <TT>operator*()</TT> is tied to the lifetime of the 
iterator). </P>
<P>Note that the compromise resolution necessitates a change to 
<TT>reverse_iterator</TT>. It would need to use a proxy to support <TT>a[n] = 
t</TT>. </P>
<P>Note also there is one kind of mutable random access iterator that will no 
longer meet the new requirements. Currently, iterators that return an r-value 
from <TT>operator[]</TT> meet the requirements for a mutable random access 
iterartor, even though the expression <TT>a[n] = t</TT> will only modify a 
temporary that goes away. With this proposed resolution, <TT>a[n] = t</TT> will 
be required to have the same operational semantics as <TT>*(a + n) = t</TT>. 
</P>
<P><B>Proposed resolution:</B></P>
<P>In section 24.1.4 [lib.bidirectdional.iterators], change the return type in 
table 75 from "convertible to <TT>T</TT>" to <TT>T&amp;</TT>. </P>
<P>In section 24.1.5 [lib.random.access.iterators], change the operational 
semantics for <TT>a[n]</TT> to " the r-value of <TT>a[n]</TT> is equivalent to 
the r-value of <TT>*(a + n)</TT>". Add a new row in the table for the expression 
<TT>a[n] = t</TT> with a return type of convertible to <TT>T</TT> and 
operational semantics of <TT>*(a + n) = t</TT>. </P>
<HR>
<A name=309>
<H3>309.&nbsp;Does sentry catch exceptions?</H3></A>
<P><B>Section:</B>&nbsp;27.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostream.format">[lib.iostream.format]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream::sentry">[lib.istream::sentry]</A>) 
and basic_ostream&lt;&gt;::sentry (27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#195">195</A>, 
since the function performs an input operation which may fail. However, issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#195">195</A> 
amends 27.6.1.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/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>Additional comments from Martin, who isn't comfortable with the current 
proposed resolution</B> (see c++std-lib-11530)</P>
<P>The istream::sentry ctor says nothing about how the function deals with 
exemptions (27.6.1.1.2, p1 says that the class is responsible for doing 
"exception safe"(*) prefix and suffix operations but it doesn't explain what 
level of exception safety the class promises to provide). The mockup example of 
a "typical implementation of the sentry ctor" given in 27.6.1.1.2, p6, removed 
in ISO/IEC 14882:2003, doesn't show exception handling, either. Since the ctor 
is not classified as a formatted or unformatted input function, the text in 
27.6.1.1, p1 through p4 does not apply. All this would seem to suggest that the 
sentry ctor should not catch or in any way handle exceptions thrown from any 
functions it may call. Thus, the typical implementation of an istream extractor 
may look something like [1]. </P>
<P>The problem with [1] is that while it correctly sets ios::badbit if an 
exception is thrown from one of the functions called from the sentry ctor, if 
the sentry ctor reaches EOF while extracting whitespace from a stream that has 
eofbit or failbit set in exceptions(), it will cause an ios::failure to be 
thrown, which will in turn cause the extractor to set ios::badbit. </P>
<P>The only straightforward way to prevent this behavior is to move the 
definition of the sentry object in the extractor above the try block (as 
suggested by the example in 22.2.8, p9 and also indirectly supported by 
27.6.1.3, p1). See [2]. But such an implementation will allow exceptions thrown 
from functions called from the ctor to freely propagate to the caller regardless 
of the setting of ios::badbit in the stream object's exceptions(). </P>
<P>So since neither [1] nor [2] behaves as expected, the only possible solution 
is to have the sentry ctor catch exceptions thrown from called functions, set 
badbit, and propagate those exceptions if badbit is also set in exceptions(). 
(Another solution exists that deals with both kinds of sentries, but the code is 
non-obvious and cumbersome -- see [3].) </P>
<P>Please note that, as the issue points out, current libraries do not behave 
consistently, suggesting that implementors are not quite clear on the exception 
handling in istream::sentry, despite the fact that some LWG members might feel 
otherwise. (As documented by the parenthetical comment here: 
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1480.html#309) </P>
<P>Also please note that those LWG members who in Copenhagen felt that "a 
sentry's constructor should not catch exceptions, because sentries should only 
be used within (un)formatted input functions and that exception handling is the 
responsibility of those functions, not of the sentries," as noted here 
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1310.html#309 would in 
effect be either arguing for the behavior described in [1] or for extractors 
implemented along the lines of [3]. </P>
<P>The original proposed resolution (Revision 25 of the issues list) clarifies 
the role of the sentry ctor WRT exception handling by making it clear that 
extractors (both library or user-defined) should be implemented along the lines 
of [2] (as opposed to [1]) and that no exception thrown from the callees should 
propagate out of either function unless badbit is also set in exceptions(). </P>
<P>[1] Extractor that catches exceptions thrown from sentry:</P>
<BLOCKQUOTE><PRE>struct S { long i; };

istream&amp; operator&gt;&gt; (istream &amp;strm, S &amp;s)
{
    ios::iostate err = ios::goodbit;
    try {
        const istream::sentry guard (strm, false);
        if (guard) {
            use_facet&lt;num_get&lt;char&gt; &gt;(strm.getloc ())
                .get (istreambuf_iterator&lt;char&gt;(strm),
                      istreambuf_iterator&lt;char&gt;(),
                      strm, err, s.i);
        }
    }
    catch (...) {
        bool rethrow;
        try {
            strm.setstate (ios::badbit);
            rethrow = false;
        }
        catch (...) {
            rethrow = true;
        }
        if (rethrow)
            throw;
    }
    if (err)
        strm.setstate (err);
    return strm;
}
</PRE></BLOCKQUOTE>
<P>[2] Extractor that propagates exceptions thrown from sentry:</P>
<BLOCKQUOTE><PRE>istream&amp; operator&gt;&gt; (istream &amp;strm, S &amp;s)
{
    istream::sentry guard (strm, false);
    if (guard) {
        ios::iostate err = ios::goodbit;
        try {
            use_facet&lt;num_get&lt;char&gt; &gt;(strm.getloc ())
                .get (istreambuf_iterator&lt;char&gt;(strm),
                      istreambuf_iterator&lt;char&gt;(),
                      strm, err, s.i);
        }
        catch (...) {
            bool rethrow;
            try {
                strm.setstate (ios::badbit);
                rethrow = false;
            }
            catch (...) {
                rethrow = true;
            }
            if (rethrow)
                throw;
        }
        if (err)
            strm.setstate (err);
    }
    return strm;
}
</PRE></BLOCKQUOTE>
<P>[3] Extractor that catches exceptions thrown from sentry but doesn't set 
badbit if the exception was thrown as a result of a call to strm.clear(). </P>
<BLOCKQUOTE><PRE>istream&amp; operator&gt;&gt; (istream &amp;strm, S &amp;s)
{
    const ios::iostate state = strm.rdstate ();
    const ios::iostate except = strm.exceptions ();
    ios::iostate err = std::ios::goodbit;
    bool thrown = true;
    try {
        const istream::sentry guard (strm, false);
        thrown = false;
        if (guard) {
            use_facet&lt;num_get&lt;char&gt; &gt;(strm.getloc ())
                .get (istreambuf_iterator&lt;char&gt;(strm),
                      istreambuf_iterator&lt;char&gt;(),
                      strm, err, s.i);
        }
    }
    catch (...) {
        if (thrown &amp;&amp; state &amp; except)
            throw;
        try {
            strm.setstate (ios::badbit);
            thrown = false;
        }
        catch (...) {
            thrown = true;
        }
        if (thrown)
            throw;
    }
    if (err)
        strm.setstate (err);

    return strm;
}
</PRE></BLOCKQUOTE>
<P><B>Proposed resolution:</B></P>
<P>Remove the last sentence of 27.6.1.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream::sentry">[lib.istream::sentry]</A> 
p5 (but not the footnote, which should be moved to the preceding sentence).</P>
<P>Remove the last sentence of 27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A> 
p3 (but not the footnote, which should be moved to the preceding sentence).</P>
<P><B>Rationale:</B></P>
<P>The LWG feels that no clarification of EH policy is necessary: the standard 
is precise about which operations sentry's constructor performs, and about which 
of those operations can throw. However, the sentence at the end should be 
removed because it's redundant.</P>
<HR>
<A name=342>
<H3>342.&nbsp;seek and eofbit</H3></A>
<P><B>Section:</B>&nbsp;27.6.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream.unformatted">[lib.istream.unformatted]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Howard Hinnant&nbsp; <B>Date:</B>&nbsp;09 Oct 201</P>
<P>I think we have a defect.</P>
<P>According to lwg issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#60">60</A> 
which is now a dr, the description of seekg in 27.6.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream.unformatted">[lib.istream.unformatted]</A> 
paragraph 38 now looks like:</P>
<BLOCKQUOTE>Behaves as an unformatted input function (as described in 
  27.6.1.3, paragraph 1), except that it does not count the number of characters 
  extracted and does not affect the value returned by subsequent calls to 
  gcount(). After constructing a sentry object, if fail() != true, executes 
  rdbuf()&shy;&gt;pubseekpos( pos). </BLOCKQUOTE>
<P>And according to lwg issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#243">243</A> 
which is also now a dr, 27.6.1.3, paragraph 1 looks like:</P>
<BLOCKQUOTE>Each unformatted input function begins execution by constructing 
  an object of class sentry with the default argument noskipws (second) argument 
  true. If the sentry object returns true, when converted to a value of type 
  bool, the function endeavors to obtain the requested input. 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. If an exception is thrown during 
  input then ios::badbit is turned on in *this'ss error state. If 
  (exception()&amp;badbit)!= 0 then the exception is rethrown. It also counts 
  the number of characters extracted. If no exception has been thrown it ends by 
  storing the count in a member object and returning the value specified. In any 
  event the sentry object is destroyed before leaving the unformatted input 
  function. </BLOCKQUOTE>
<P>And finally 27.6.1.1.2/5 says this about sentry:</P>
<BLOCKQUOTE>If, after any preparation is completed, is.good() is true, ok_ != 
  false otherwise, ok_ == false. </BLOCKQUOTE>
<P>So although the seekg paragraph says that the operation proceeds if !fail(), 
the behavior of unformatted functions says the operation proceeds only if 
good(). The two statements are contradictory when only eofbit is set. I don't 
think the current text is clear which condition should be respected. </P>
<P><B>Further discussion from Redmond:</B></P>
<P>PJP: It doesn't seem quite right to say that <TT>seekg</TT> is "unformatted". 
That makes specific claims about sentry that aren't quite appropriate for 
seeking, which has less fragile failure modes than actual input. If we do really 
mean that it's unformatted input, it should behave the same way as other 
unformatted input. On the other hand, "principle of least surprise" is that 
seeking from EOF ought to be OK.</P>
<P>Dietmar: nothing should depend on eofbit. Eofbit should only be examined by 
the user to determine why something failed.</P>
<P><I>[Taken from c++std-lib-8873, c++std-lib-8874, c++std-lib-8876]</I></P>
<P><B>Proposed resolution:</B></P>
<P><I>[Santa Cruz: On the one hand, it would clearly be silly to seek to a 
non-EOF position without resetting eofbit. On the other hand, having seek clear 
eofbit explicitly would set a major precedent: there is currently <I>no</I> 
place where any of the flags are reset without the user explicitly asking for 
them to be. This is the tip of a general problem, that the various flags are 
stickier than many users might expect. Bill, Gaby, and Howard will discuss this 
issue and propose a resolution.]</I></P>
<HR>
<A name=356>
<H3>356.&nbsp;Meaning of ctype_base::mask enumerators</H3></A>
<P><B>Section:</B>&nbsp;22.2.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.category.ctype">[lib.category.ctype]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Matt Austern&nbsp; <B>Date:</B>&nbsp;23 Jan 2002</P>
<P>What should the following program print?</P><PRE>  #include &lt;locale&gt;
  #include &lt;iostream&gt;

  class my_ctype : public std::ctype&lt;char&gt;
  {
    typedef std::ctype&lt;char&gt; base;
  public:
    my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
    {
      std::copy(base::classic_table(), base::classic_table() + base::table_size,
                my_table);
      my_table[(unsigned char) '_'] = (base::mask) (base::print | base::space);
    }
  private:
    mask my_table[base::table_size];
  };

  int main()
  {
    my_ctype ct;
    std::cout &lt;&lt; "isspace: " &lt;&lt; ct.is(std::ctype_base::space, '_') &lt;&lt; "    "
              &lt;&lt; "isalpha: " &lt;&lt; ct.is(std::ctype_base::alpha, '_') &lt;&lt; std::endl;
  }
</PRE>
<P>The goal is to create a facet where '_' is treated as whitespace.</P>
<P>On gcc 3.0, this program prints "isspace: 1 isalpha: 0". On Microsoft C++ it 
prints "isspace: 1 isalpha: 1".</P>
<P>I believe that both implementations are legal, and the standard does not give 
enough guidance for users to be able to use std::ctype's protected interface 
portably.</P>
<P>The above program assumes that ctype_base::mask enumerators like 
<TT>space</TT> and <TT>print</TT> are disjoint, and that the way to say that a 
character is both a space and a printing character is to or those two 
enumerators together. This is suggested by the "exposition only" values in 
22.2.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.category.ctype">[lib.category.ctype]</A>, 
but it is nowhere specified in normative text. An alternative interpretation is 
that the more specific categories subsume the less specific. The above program 
gives the results it does on the Microsoft compiler because, on that compiler, 
<TT>print</TT> has all the bits set for each specific printing character class. 
</P>
<P>From the point of view of std::ctype's public interface, there's no important 
difference between these two techniques. From the point of view of the protected 
interface, there is. If I'm defining a facet that inherits from 
std::ctype&lt;char&gt;, I'm the one who defines the value that table()['a'] 
returns. I need to know what combination of mask values I should use. This isn't 
so very esoteric: it's exactly why std::ctype has a protected interface. If we 
care about users being able to write their own ctype facets, we have to give 
them a portable way to do it. </P>
<P>Related reflector messages: lib-9224, lib-9226, lib-9229, lib-9270, lib-9272, 
lib-9273, lib-9274, lib-9277, lib-9279. </P>
<P>Issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#339">339</A> 
is related, but not identical. The proposed resolution if issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#339">339</A> 
says that ctype_base::mask must be a bitmask type. It does not say that the 
ctype_base::mask elements are bitmask elements, so it doesn't directly affect 
this issue.</P>
<P>More comments from Benjamin Kosnik, who believes that that C99 compatibility 
essentially requires what we're calling option 1 below.</P>
<BLOCKQUOTE><PRE>I think the C99 standard is clear, that isspace -&gt; !isalpha.
--------

#include &lt;locale&gt;
#include &lt;iostream&gt;

class my_ctype : public std::ctype&lt;char&gt;
{
private:
  typedef std::ctype&lt;char&gt; base;
  mask my_table[base::table_size];

public:
  my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
  {
    std::copy(base::classic_table(), base::classic_table() + base::table_size,
              my_table);
    mask both = base::print | base::space;
    my_table[static_cast&lt;mask&gt;('_')] = both;
  }
};

int main()
{
  using namespace std;
  my_ctype ct;
  cout &lt;&lt; "isspace: " &lt;&lt; ct.is(ctype_base::space, '_') &lt;&lt; endl;
  cout &lt;&lt; "isprint: " &lt;&lt; ct.is(ctype_base::print, '_') &lt;&lt; endl;

  // ISO C99, isalpha iff upper | lower set, and !space.
  // 7.5, p 193
  // -&gt; looks like g++ behavior is correct.
  // 356 -&gt; bitmask elements are required for ctype_base
  // 339 -&gt; bitmask type required for mask
  cout &lt;&lt; "isalpha: " &lt;&lt; ct.is(ctype_base::alpha, '_') &lt;&lt; endl;
}
</PRE></BLOCKQUOTE>
<P><B>Proposed resolution:</B></P>
<P>Informally, we have three choices:</P>
<OL>
  <LI>Require that the enumerators are disjoint (except for alnum and graph) 
  <LI>Require that the enumerators are not disjoint, and specify which of them 
  subsume which others. (e.g. mandate that lower includes alpha and print) 
  <LI>Explicitly leave this unspecified, which the result that the above program 
  is not portable. </LI></OL>
<P>Either of the first two options is just as good from the standpoint of 
portability. Either one will require some implementations to change.</P>
<P><I>[ More discussion is needed. Nobody likes option 3. Options 1 and 2 are 
both controversial, 2 perhaps less so. Benjamin thinks that option 1 is required 
for C99 compatibility. ]</I></P>
<HR>
<A name=362>
<H3>362.&nbsp;bind1st/bind2nd type safety</H3></A>
<P><B>Section:</B>&nbsp;20.3.6.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.bind.1st">[lib.bind.1st]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andrew Demkin&nbsp; <B>Date:</B>&nbsp;26 Apr 2002</P>
<P>The definition of bind1st() (20.3.6.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.bind.1st">[lib.bind.1st]</A>) 
can result in the construction of an unsafe binding between incompatible pointer 
types. For example, given a function whose first parameter type is 'pointer to 
T', it's possible without error to bind an argument of type 'pointer to U' when 
U does not derive from T: </P><PRE>   foo(T*, int);

   struct T {};
   struct U {};

   U u;

   int* p;
   int* q;

   for_each(p, q, bind1st(ptr_fun(foo), &amp;u));    // unsafe binding
</PRE>
<P>The definition of bind1st() includes a functional-style conversion to map its 
argument to the expected argument type of the bound function (see below): </P><PRE>  typename Operation::first_argument_type(x)
</PRE>
<P>A functional-style conversion (5.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/expr.html#expr.type.conv">[expr.type.conv]</A>) 
is defined to be semantically equivalent to an explicit cast expression (5.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/expr.html#expr.cast">[expr.cast]</A>), 
which may (according to 5.4, paragraph 5) be interpreted as a reinterpret_cast, 
thus masking the error. </P>
<P>The problem and proposed change also apply to 20.3.6.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.bind.2nd">[lib.bind.2nd]</A>.</P>
<P><B>Proposed resolution:</B></P>
<P>The simplest and most localized change to prevent such errors is to require 
bind1st() use a static_cast expression rather than the functional-style 
conversion; that is, have bind1st() return: </P><PRE>   binder1st&lt;Operation&gt;( op,
     static_cast&lt;typename Operation::first_argument_type&gt;(x)).
</PRE>
<P>A more agressive solution is to change the semantics of functional-style 
conversions to not permit a reinterpret_cast. For contexts that require the 
semantics of reinterpret_cast, the language may want to require the use of an 
explicit cast expression such as '(T) x' or 'reinterpret_cast&lt;T&gt;(x)' and 
limit the behavior of the functional notation to match statically-checked and 
standard conversions (as defined by 5.2.9 and 4.10, etc.). Although changing the 
semantics of functional-style conversions may seem drastic and does have 
language-wide ramifications, it has the benefit of better unifying the 
conversion rules for user defined types and built-in types, which can be 
especially important for generic template programming. </P>
<P><I>[Santa Cruz: it's clear that a function-style cast is wrong. Maybe a 
static cast would be better, or maybe no cast at all. Jeremy will check with the 
original author of this part of the Standard and will see what the original 
intent was.]</I></P>
<HR>
<A name=366>
<H3>366.&nbsp;Excessive const-qualification</H3></A>
<P><B>Section:</B>&nbsp;27 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.input.output">[lib.input.output]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Walter Brown, Marc Paterno&nbsp; <B>Date:</B>&nbsp;10 May 
2002</P>
<P>The following member functions are declared const, yet return non-const 
pointers. We believe they are should be changed, because they allow code that 
may surprise the user. See document N1360 for details and rationale. </P>
<P><I>[Santa Cruz: the real issue is that we've got const member functions that 
return pointers to non-const, and N1360 proposes replacing them by overloaded 
pairs. There isn't a consensus about whether this is a real issue, since we've 
never said what our constness policy is for iostreams. N1360 relies on a 
distinction between physical constness and logical constness; that distinction, 
or those terms, does not appear in the standard.]</I></P>
<P><B>Proposed resolution:</B></P>
<P>In 27.4.4 and 27.4.4.2</P>
<P>Replace</P><PRE>  basic_ostream&lt;charT,traits&gt;* tie() const;
</PRE>
<P>with</P><PRE>  basic_ostream&lt;charT,traits&gt;* tie();
  const basic_ostream&lt;charT,traits&gt;* tie() const;
</PRE>
<P>and replace</P><PRE>  basic_streambuf&lt;charT,traits&gt;* rdbuf() const;
</PRE>
<P>with</P><PRE>  basic_streambuf&lt;charT,traits&gt;* rdbuf();
  const basic_streambuf&lt;charT,traits&gt;* rdbuf() const;
</PRE>
<P>In 27.5.2 and 27.5.2.3.1</P>
<P>Replace</P><PRE>  char_type* eback() const;
</PRE>
<P>with</P><PRE>  char_type* eback();
  const char_type* eback() const;
</PRE>
<P>Replace</P><PRE>  char_type gptr() const;
</PRE>
<P>with</P><PRE>  char_type* gptr();
  const char_type* gptr() const;
</PRE>
<P>Replace</P><PRE>  char_type* egptr() const;
</PRE>
<P>with</P><PRE>  char_type* egptr();
  const char_type* egptr() const;
</PRE>
<P>In 27.5.2 and 27.5.2.3.2</P>
<P>Replace</P><PRE>  char_type* pbase() const;
</PRE>
<P>with</P><PRE>  char_type* pbase();
  const char_type* pbase() const;
</PRE>
<P>Replace</P><PRE>  char_type* pptr() const;
</PRE>
<P>with</P><PRE>  char_type* pptr();
  const char_type* pptr() const;
</PRE>
<P>Replace</P><PRE>  char_type* epptr() const;
</PRE>
<P>with</P><PRE>  char_type* epptr();
  const char_type* epptr() const;
</PRE>
<P>In 27.7.2, 27.7.2.2, 27.7.3 27.7.3.2, 27.7.4, and 27.7.6</P>
<P>Replace</P><PRE>  basic_stringbuf&lt;charT,traits,Allocator&gt;* rdbuf() const;
</PRE>
<P>with</P><PRE>  basic_stringbuf&lt;charT,traits,Allocator&gt;* rdbuf();
  const basic_stringbuf&lt;charT,traits,Allocator&gt;* rdbuf() const;
</PRE>
<P>In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13</P>
<P>Replace</P><PRE>  basic_filebuf&lt;charT,traits&gt;* rdbuf() const;
</PRE>
<P>with</P><PRE>  basic_filebuf&lt;charT,traits&gt;* rdbuf();
  const basic_filebuf&lt;charT,traits&gt;* rdbuf() const;
</PRE>
<HR>
<A name=368>
<H3>368.&nbsp;basic_string::replace has two "Throws" paragraphs</H3></A>
<P><B>Section:</B>&nbsp;21.3.5.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-strings.html#lib.string::replace">[lib.string::replace]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Beman Dawes&nbsp; <B>Date:</B>&nbsp;3 Jun 2002</P>
<P>21.3.5.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-strings.html#lib.string::replace">[lib.string::replace]</A> 
basic_string::replace, second signature, given in paragraph 1, has two "Throws" 
paragraphs (3 and 5). </P>
<P>In addition, the second "Throws" paragraph (5) includes specification 
(beginning with "Otherwise, the function replaces ...") that should be part of 
the "Effects" paragraph. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[This is a typo that escalated. It's clear that what's in the Standard is 
wrong. It's less clear what the fix ought to be. Someone who understands string 
replace well needs to work on this.]</I></P>
<HR>
<A name=369>
<H3>369.&nbsp;io stream objects and static ctors</H3></A>
<P><B>Section:</B>&nbsp;27.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostream.objects">[lib.iostream.objects]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Ruslan Abdikeev&nbsp; <B>Date:</B>&nbsp;8 Jul 2002</P>
<P>Is it safe to use standard iostream objects from constructors of static 
objects? Are standard iostream objects constructed and are their associations 
established at that time? </P>
<P>Surpisingly enough, Standard does NOT require that.</P>
<P>27.3/2 [lib.iostream.objects] guarantees that standard iostream objects are 
constructed and their associations are established before the body of main() 
begins execution. It also refers to ios_base::Init class as the panacea for 
constructors of static objects. </P>
<P>However, there's nothing in 27.3 [lib.iostream.objects], in 27.4.2 
[lib.ios.base], and in 27.4.2.1.6 [lib.ios::Init], that would require 
implementations to allow access to standard iostream objects from constructors 
of static objects. </P>
<P>Details:</P>
<P>Core text refers to some magic object ios_base::Init, which will be discussed 
below:</P>
<BLOCKQUOTE>"The [standard iostream] objects are constructed, and their 
  associations are established at some time prior to or during first time an 
  object of class basic_ios&lt;charT,traits&gt;::Init is constructed, and in any 
  case before the body of main begins execution." (27.3/2 
  [lib.iostream.objects]) </BLOCKQUOTE>
<P>The first <I>non-normative</I> footnote encourages implementations to 
initialize standard iostream objects earlier than required. </P>
<P>However, the second <I>non-normative</I> footnote makes an explicit and 
unsupported claim:</P>
<BLOCKQUOTE>"Constructors and destructors for static objects can access these 
  [standard iostream] objects to read input from stdin or write output to stdout 
  or stderr." (27.3/2 footnote 265 [lib.iostream.objects]) </BLOCKQUOTE>
<P>The only bit of magic is related to that ios_base::Init class. AFAIK, the 
rationale behind ios_base::Init was to bring an instance of this class to each 
translation unit which #included &lt;iostream&gt; or related header. Such an 
inclusion would support the claim of footnote quoted above, because in order to 
use some standard iostream object it is necessary to #include &lt;iostream&gt;. 
</P>
<P>However, while Standard explicitly describes ios_base::Init as an appropriate 
class for doing the trick, I failed to found a mention of an _instance_ of 
ios_base::Init in Standard. </P>
<P><B>Proposed resolution:</B></P>
<P>Add to [lib.iostream.objects], p2, immediately before the last sentence of 
the paragraph, the following two sentences:</P>
<BLOCKQUOTE>It is implementation-defined whether the header &lt;iostream&gt; 
  defines an ios_base::Init object or not. If it does not, an implementation 
  must specify the means of achieving safe access to the standard objects for 
  input and output during program startup. </BLOCKQUOTE>
<P><I>[Santa Cruz: The LWG is leaning toward NAD. There isn't any normative 
wording saying that the Init scheme will be used, but that is probably 
intentional. Implementers use dirty tricks for iostream initialization, and 
doing it portably is somewhere between difficult and impossible. Too much 
constraint in this area is dangerous, and if we are to make any changes it would 
probably be more appropriate for them to be nonnormative. Summer '04 mid-meeting 
mailing: Martin provided wording for resolution and rationale.]</I></P>
<P><B>Rationale:</B></P>
<P>The original proposed resolution unconditionally required implementations to 
define an ios_base::Init object of some implementation-defined name in the 
header &lt;iostream&gt;. That's an overspecification. First, defining the object 
may be unnecessary and even detrimental to performance if an implementation can 
guarantee that the 8 standard iostream objects will be initialized before any 
other user-defined object in a program. Second, there is no need to require 
implementations to document the name of the object.</P>
<P>The new proposed resolution specifies that implementations may (but need not) 
define an ios_base::Init object, while requiring them to document whether they 
do or not, and if not, to document how portable programs achieve safe access to 
the 8 standard iostream objects during program startup (3.6)(*). The intent is 
that if an implementation documents that &lt;iostream&gt; defines an 
ios_base::Init object, it implies that the header must be #included before any 
references to the standard iostream objects. Otherwise, if an implementation 
does not define an ios_base::Init object in &lt;iostream&gt; it must either 
assure and document that the standard iostream objects are safely accessible at 
startup, or specify what a portable program must do to safely access them (e.g., 
it may require that a program define an ios_base::Init object before doing so, 
or that it call ios::sync_with_stdio(), etc.). </P>
<P>(*) Note that the term startup is broader than the term "Constructors and 
destructors for static objects" used in Footnote 265 since the former includes 
other functions besides constructors and destructors, including the following 
example: </P><PRE>    int foo () { return (std::cout &lt;&lt; "foo()\n").rdstate (); }
    int i = foo ();
    int main () { return i; }
</PRE>
<HR>
<A name=371>
<H3>371.&nbsp;Stability of multiset and multimap member functions</H3></A>
<P><B>Section:</B>&nbsp;23.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.container.requirements">[lib.container.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Frank Compagner&nbsp; <B>Date:</B>&nbsp;20 Jul 2002</P>
<P>The requirements for multiset and multimap containers (23.1 
[lib.containers.requirements], 23.1.2 [lib.associative.reqmnts], 23.3.2 
[lib.multimap] and 23.3.4 [lib.multiset]) make no mention of the stability of 
the required (mutating) member functions. It appears the standard allows these 
functions to reorder equivalent elements of the container at will, yet the 
pervasive red-black tree implementation appears to provide stable behaviour. 
</P>
<P>This is of most concern when considering the behaviour of erase(). A 
stability requirement would guarantee the correct working of the following 
'idiom' that removes elements based on a certain predicate function. </P><PRE>  multimap&lt;int, int&gt; m;
  multimap&lt;int, int&gt;::iterator i = m.begin();
  while (i != m.end()) {
      if (pred(i))
          m.erase (i++);
      else
          ++i;
  }
</PRE>
<P>Although clause 23.1.2/8 guarantees that i remains a valid iterator througout 
this loop, absence of the stability requirement could potentially result in 
elements being skipped. This would make this code incorrect, and, furthermore, 
means that there is no way of erasing these elements without iterating first 
over the entire container, and second over the elements to be erased. This would 
be unfortunate, and have a negative impact on both performance and code 
simplicity. </P>
<P>If the stability requirement is intended, it should be made explicit 
(probably through an extra paragraph in clause 23.1.2). </P>
<P>If it turns out stability cannot be guaranteed, i'd argue that a remark or 
footnote is called for (also somewhere in clause 23.1.2) to warn against relying 
on stable behaviour (as demonstrated by the code above). If most implementations 
will display stable behaviour, any problems emerging on an implementation 
without stable behaviour will be hard to track down by users. This would also 
make the need for an erase_if() member function that much greater. </P>
<P>This issue is somewhat related to LWG issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#130">130</A>.</P>
<P><I>[Santa Cruz: More people need to look at this. Much user code may assume 
stability. On the other hand, it seems drastic to add a new requirement 
now.]</I></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=376>
<H3>376.&nbsp;basic_streambuf semantics</H3></A>
<P><B>Section:</B>&nbsp;27.7.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.stringbuf.virtuals">[lib.stringbuf.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Ray Lischner&nbsp; <B>Date:</B>&nbsp;14 Aug 2002</P>
<P>In Section 27.7.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.stringbuf.virtuals">[lib.stringbuf.virtuals]</A>, 
Table 90, the implication is that the four conditions should be mutually 
exclusive, but they are not. The first two cases, as written, are subcases of 
the third. I think it would be clearer if the conditions were rewritten as 
follows: </P>
<BLOCKQUOTE>
  <P>(which &amp; (ios_base::in|ios_base::out)) == ios_base::in </P>
  <P>(which &amp; (ios_base::in|ios_base::out)) == ios_base::out </P>
  <P>(which &amp; (ios_base::in|ios_base::out)) == (ios_base::in|ios_base::out) 
  and way == either ios_base::beg or ios_base::end </P>
  <P>Otherwise</P></BLOCKQUOTE>
<P>As written, it is unclear what should be the result if cases 1 &amp; 2 are 
true, but case 3 is false, e.g., </P>
<BLOCKQUOTE>seekoff(0, ios_base::cur, ios_base::in | ios_base::out) 
</BLOCKQUOTE>
<P><I>[Santa Cruz: The ambiguity seems real. We need to do a survey of 
implementations before we decide on a solution.]</I></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=378>
<H3>378.&nbsp;locale immutability and locale::operator=()</H3></A>
<P><B>Section:</B>&nbsp;22.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale">[lib.locale]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;6 Sep 2002</P>
<P>I think there is a problem with 22.1.1, p6 which says that </P><PRE>    -6- An instance of locale is immutable; once a facet reference
        is obtained from it, that reference remains usable as long
        as the locale value itself exists.
</PRE>
<P>and 22.1.1.2, p4: </P><PRE>    const locale&amp; operator=(const locale&amp; other) throw();

    -4- Effects: Creates a copy of other, replacing the current value.
</PRE>
<P>How can a reference to a facet obtained from a locale object remain valid 
after an assignment that clearly must replace all the facets in the locale 
object? Imagine a program such as this </P><PRE>    std::locale loc ("de_DE");
    const std::ctype&lt;char&gt; &amp;r0 = std::use_facet&lt;std::ctype&lt;char&gt; &gt;(loc);
    loc = std::locale ("en_US");
    const std::ctype&lt;char&gt; &amp;r1 = std::use_facet&lt;std::ctype&lt;char&gt; &gt;(loc);
</PRE>
<P>Is r0 really supposed to be preserved and destroyed only when loc goes out of 
scope? </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Summer '04 mid-meeting mailing: Martin and Dietmar believe this is a 
duplicate of issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#31">31</A> 
and recommend that it be closed. ]</I></P>
<HR>
<A name=382>
<H3>382.&nbsp;codecvt do_in/out result</H3></A>
<P><B>Section:</B>&nbsp;22.2.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.codecvt">[lib.locale.codecvt]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;30 Aug 2002</P>
<P>It seems that the descriptions of codecvt do_in() and do_out() leave 
sufficient room for interpretation so that two implementations of codecvt may 
not work correctly with the same filebuf. Specifically, the following seems less 
than adequately specified: </P>
<OL>
  <LI>the conditions under which the functions terminate 
  <LI>precisely when the functions return ok 
  <LI>precisely when the functions return partial 
  <LI>the full set of conditions when the functions return error </LI></OL>
<OL>
  <LI>22.2.1.5.2 <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</A>, 
  p2 says this about the effects of the function: ...Stops if it encounters a 
  character it cannot convert... This assumes that there *is* a character to 
  convert. What happens when there is a sequence that doesn't form a valid 
  source character, such as an unassigned or invalid UNICODE character, or a 
  sequence that cannot possibly form a character (e.g., the sequence "\xc0\xff" 
  in UTF-8)? 
  <LI>Table 53 says that the function returns codecvt_base::ok to indicate that 
  the function(s) "completed the conversion." Suppose that the source sequence 
  is "\xc0\x80" in UTF-8, with from pointing to '\xc0' and (from_end==from + 1). 
  It is not clear whether the return value should be ok or partial (see below). 
  <LI>Table 53 says that the function returns codecvt_base::partial if "not all 
  source characters converted." With the from pointers set up the same way as 
  above, it is not clear whether the return value should be partial or ok (see 
  above). 
  <LI>Table 53, in the row describing the meaning of error mistakenly refers to 
  a "from_type" character, without the symbol from_type having been defined. 
  Most likely, the word "source" character is intended, although that is not 
  sufficient. The functions may also fail when they encounter an invalid source 
  sequence that cannot possibly form a valid source character (e.g., as 
  explained in bullet 1 above). </LI></OL>
<P>Finally, the conditions described at the end of 22.2.1.5.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</A>, 
p4 don't seem to be possible: </P>
<BLOCKQUOTE>"A return value of partial, if (from_next == from_end), indicates 
  that either the destination sequence has not absorbed all the available 
  destination elements, or that additional source elements are needed before 
  another destination element can be produced." </BLOCKQUOTE>
<P>If the value is partial, it's not clear to me that (from_next ==from_end) 
could ever hold if there isn't enough room in the destination buffer. In order 
for (from_next==from_end) to hold, all characters in that range must have been 
successfully converted (according to 22.2.1.5.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.codecvt.virtuals">[lib.locale.codecvt.virtuals]</A>, 
p2) and since there are no further source characters to convert, no more room in 
the destination buffer can be needed. </P>
<P>It's also not clear to me that (from_next==from_end) could ever hold if 
additional source elements are needed to produce another destination character 
(not element as incorrectly stated in the text). partial is returned if "not all 
source characters have been converted" according to Table 53, which also implies 
that (from_next==from) does NOT hold. </P>
<P>Could it be that the intended qualifying condition was actually (from_next != 
from_end), i.e., that the sentence was supposed to read </P>
<BLOCKQUOTE>"A return value of partial, if (from_next != from_end),..." 
</BLOCKQUOTE>
<P>which would make perfect sense, since, as far as I understand it, partial can 
only occur if (from_next != from_end)? </P>
<P><B>Proposed resolution:</B></P>
<P>To address these issues, I propose that paragraphs 2, 3, and 4 be rewritten 
as follows. The proposal incorporates the accepted resolution of lwg issue 19. 
</P><PRE>-2- Effects: Converts characters in the range of source elements
    [from, from_end), placing the results in sequential positions
    starting at destination to. Converts no more than (from_end &shy; from)
    source elements, and stores no more than (to_limit &shy; to)
    destination elements.

    Stops if it encounters a sequence of source elements it cannot
    convert to a valid destination character. It always leaves the
    from_next and to_next pointers pointing one beyond the last
    element successfully converted.

    [Note: If returns noconv, internT and externT are the same type
    and the converted sequence is identical to the input sequence
    [from, from_next). to_next is set equal to to, the value of
    state is unchanged, and there are no changes to the values in
    [to, to_limit). --end note]

-3- Notes: Its operations on state are unspecified.
    [Note: This argument can be used, for example, to maintain shift
    state, to specify conversion options (such as count only), or to
    identify a cache of seek offsets. --end note]

-4- Returns: An enumeration value, as summarized in Table 53:

    Table 53 -- do_in/do_out result values

     Value      Meaning
    +---------+----------------------------------------------------+
    | ok      | successfully completed the conversion of all       |
    |         | complete characters in the source range            |
    +---------+----------------------------------------------------+
    | partial | the characters in the source range would, after    |
    |         | conversion, require space greater than that        |
    |         | available in the destination range                 |
    +---------+----------------------------------------------------+
    | error   | encountered either a sequence of elements in the   |
    |         | source range forming a valid source character that |
    |         | could not be converted to a destination character, |
    |         | or a sequence of elements in the source range that |
    |         | could not possibly form a valid source character   |
    +---------+----------------------------------------------------+
    | noconv  | internT and externT are the same type, and input   |
    |         | sequence is identical to converted sequence        |
    +---------+----------------------------------------------------+

    A return value of partial, i.e., if (from_next != from_end),
    indicates that either the destination sequence has not absorbed
    all the available destination elements, or that additional
    source elements are needed before another destination character
    can be produced.
</PRE>
<P><I>[Santa Cruz: The LWG agrees that this is an important issue and that this 
general direction is probably correct. Dietmar, Howard, PJP, and Matt will 
review this wording.]</I></P>
<P><I>[Kona: this isn't quite right. (a) the description of noconv is too vague, 
both in the existing standard and in the current proposed resolution; (b) the 
description of what noconv means should be normative; (c) the phrase "partial, 
i.e. if from_next != from_end" isn't quite right, because those are two separate 
cases, it's possible to get partial either form insufficient input or from 
insufficient space in the output buffer. The big problem is that the standard is 
written with the assumption of 1-&gt;N conversion in mind, not M-&gt;N. Bill, 
Howard, and Martin will provide new wording. ]</I></P>
<HR>
<A name=384>
<H3>384.&nbsp;equal_range has unimplementable runtime complexity</H3></A>
<P><B>Section:</B>&nbsp;25.3.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.equal.range">[lib.equal.range]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Hans Bos&nbsp; <B>Date:</B>&nbsp;18 Oct 2002</P>
<P>Section 25.3.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.equal.range">[lib.equal.range]</A> 
states that at most 2 * log(last - first) + 1 comparisons are allowed for 
equal_range. </P>
<P>It is not possible to implement equal_range with these constraints.</P>
<P>In a range of one element as in:</P><PRE>    int x = 1;
    equal_range(&amp;x, &amp;x + 1, 1)
</PRE>
<P>it is easy to see that at least 2 comparison operations are needed.</P>
<P>For this case at most 2 * log(1) + 1 = 1 comparison is allowed.</P>
<P>I have checked a few libraries and they all use the same (nonconforming) 
algorithm for equal_range that has a complexity of</P><PRE>     2* log(distance(first, last)) + 2.
</PRE>
<P>I guess this is the algorithm that the standard assumes for equal_range.</P>
<P>It is easy to see that 2 * log(distance) + 2 comparisons are enough since 
equal range can be implemented with lower_bound and upper_bound (both 
log(distance) + 1). </P>
<P>I think it is better to require something like 2log(distance) + O(1) (or even 
logarithmic as multiset::equal_range). Then an implementation has more room to 
optimize for certain cases (e.g. have log(distance) characteristics when at most 
match is found in the range but 2log(distance) + 4 for the worst case). </P>
<P><I>[Santa Cruz: The issue is real, but of greater scope than just 
equal_range: it affects all of the binary search algorithms. What is the 
complexity supposed to be for ranges of 0 or 1 elements? What base are we using 
for the logarithm? Are these bounds supposed to be exact, or asymptotic? (If the 
latter, of course, then none of the other questions matter.)]</I></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=385>
<H3>385.&nbsp;Does call by value imply the CopyConstructible 
requirement?</H3></A>
<P><B>Section:</B>&nbsp;17 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.library">[lib.library]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Matt Austern&nbsp; <B>Date:</B>&nbsp;23 Oct 2002</P>
<P>Many function templates have parameters that are passed by value; a typical 
example is <TT>find_if</TT>'s <I>pred</I> parameter in 25.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.find">[lib.alg.find]</A>. 
Are the corresponding template parameters (<TT>Predicate</TT> in this case) 
implicitly required to be CopyConstructible, or does that need to be spelled out 
explicitly? </P>
<P>This isn't quite as silly a question as it might seem to be at first sight. 
If you call <TT>find_if</TT> in such a way that template argument deduction 
applies, then of course you'll get call by value and you need to provide a copy 
constructor. If you explicitly provide the template arguments, however, you can 
force call by reference by writing something like <TT>find_if&lt;my_iterator, 
my_predicate&amp;&gt;</TT>. The question is whether implementation are required 
to accept this, or whether this is ill-formed because my_predicate&amp; is not 
CopyConstructible. </P>
<P>The scope of this problem, if it is a problem, is unknown. Function object 
arguments to generic algorithms in clauses 25 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.algorithms">[lib.algorithms]</A> 
and 26 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.numerics">[lib.numerics]</A> 
are obvious examples. A review of the whole library is necessary. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[ This is really two issues. First, predicates are typically passed by 
value but we don't say they must be Copy Constructible. They should be. Second: 
is specialization allowed to transform value arguments into references? 
References aren't copy constructible, so this should not be allowed. ]</I></P>
<HR>
<A name=386>
<H3>386.&nbsp;Reverse iterator's operator[] has impossible return type</H3></A>
<P><B>Section:</B>&nbsp;24.4.1.3.11 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.reverse.iter.opindex">[lib.reverse.iter.opindex]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Matt Austern&nbsp; <B>Date:</B>&nbsp;23 Oct 2002</P>
<P>In 24.4.1.3.11 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.reverse.iter.opindex">[lib.reverse.iter.opindex]</A>, 
<TT>reverse_iterator&lt;&gt;::operator[]</TT> is specified as having a return 
type of <TT>reverse_iterator::reference</TT>, which is the same as 
<TT>iterator_traits&lt;Iterator&gt;::reference</TT>. (Where <TT>Iterator</TT> is 
the underlying iterator type.)</P>
<P>The trouble is that <TT>Iterator</TT>'s own operator[] doesn't necessarily 
have a return type of <TT>iterator_traits&lt;Iterator&gt;::reference</TT>. Its 
return type is merely required to be convertible to <TT>Iterator</TT>'s value 
type. The return type specified for reverse_iterator's operator[] would thus 
appear to be impossible.</P>
<P>With the resolution of issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#299">299</A>, 
the type of <TT>a[n]</TT> will continue to be required (for random access 
iterators) to be convertible to the value type, and also <TT>a[n] = t</TT> will 
be a valid expression. Implementations of <TT>reverse_iterator</TT> will likely 
need to return a proxy from <TT>operator[]</TT> to meet these requirements. As 
mentioned in the comment from Dave Abrahams, the simplest way to specify that 
<TT>reverse_iterator</TT> meet this requirement to just mandate it and leave the 
return type of <TT>operator[]</TT> unspecified.</P>
<P><B>Proposed resolution:</B></P>
<P>In 24.4.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.reverse.iter.requirements">[lib.reverse.iter.requirements]</A> 
change:</P>
<BLOCKQUOTE><PRE>reference operator[](difference_type n) const;
</PRE></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE><PRE><B><I>implementation defined</I></B> operator[](difference_type n) const; // see <FONT color=red>lib.random.access.iterators</FONT>
</PRE></BLOCKQUOTE>
<P><I>[ Comments from Dave Abrahams: IMO we should resolve 386 by just saying 
that the return type of reverse_iterator's operator[] is unspecified, allowing 
the random access iterator requirements to impose an appropriate return type. If 
we accept 299's proposed resolution (and I think we should), the return type 
will be readable and writable, which is about as good as we can do. ]</I></P>
<HR>
<A name=387>
<H3>387.&nbsp;std::complex over-encapsulated</H3></A>
<P><B>Section:</B>&nbsp;26.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.complex.numbers">[lib.complex.numbers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Gabriel Dos Reis&nbsp; <B>Date:</B>&nbsp;8 Nov 2002</P>
<P>The absence of explicit description of std::complex&lt;T&gt; layout makes it 
imposible to reuse existing software developed in traditional languages like 
Fortran or C with unambigous and commonly accepted layout assumptions. There 
ought to be a way for practitioners to predict with confidence the layout of 
std::complex&lt;T&gt; whenever T is a numerical datatype. The absence of ways to 
access individual parts of a std::complex&lt;T&gt; object as lvalues unduly 
promotes severe pessimizations. For example, the only way to change, 
independently, the real and imaginary parts is to write something like </P><PRE>complex&lt;T&gt; z;
// ...
// set the real part to r
z = complex&lt;T&gt;(r, z.imag());
// ...
// set the imaginary part to i
z = complex&lt;T&gt;(z.real(), i);
</PRE>
<P>At this point, it seems appropriate to recall that a complex number is, in 
effect, just a pair of numbers with no particular invariant to maintain. 
Existing practice in numerical computations has it that a complex number 
datatype is usually represented by Cartesian coordinates. Therefore the 
over-encapsulation put in the specification of std::complex&lt;&gt; is not 
justified. </P>
<P><B>Proposed resolution:</B></P>
<P>Add the following requirements to 26.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.complex.numbers">[lib.complex.numbers]</A> 
as 26.2/4:</P>
<BLOCKQUOTE>
  <P>If z is an lvalue expression of type cv std::complex&lt;T&gt; then</P>
  <UL>
    <LI>the expression reinterpret_cast&lt;cv T(&amp;)[2]&gt;(z) is well-formed; 
    and 
    <LI>reinterpret_cast&lt;cvT(&amp;)[2]&gt;(z)[0]designates the real part of 
    z; and 
    <LI>reinterpret_cast&lt;cvT(&amp;)[2]&gt;(z)[1]designates the imaginary part 
    of z. </LI></UL>
  <P>Moreover, if a is an expression of pointer type cv complex&lt;T&gt;* and 
  the expression a[i] is well-defined for an integer expression i then: </P>
  <UL>
    <LI>reinterpret_cast&lt;cvT*&gt;(a)[2+i] designates the real part of a[i]; 
    and 
    <LI>reinterpret_cast&lt;cv T*&gt;(a)[2+i+1] designates the imaginary part of 
    a[i]. </LI></UL></BLOCKQUOTE>
<P>In the header synopsis in 26.2.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.complex.synopsis">[lib.complex.synopsis]</A>, 
replace</P><PRE>  template&lt;class T&gt; T real(const complex&lt;T&gt;&amp;);
  template&lt;class T&gt; T imag(const complex&lt;T&gt;&amp;);
</PRE>
<P>with</P><PRE>  template&lt;class T&gt; const T&amp; real(const complex&lt;T&gt;&amp;);
  template&lt;class T&gt;       T&amp; real(      complex&lt;T&gt;&amp;);
  template&lt;class T&gt; const T&amp; imag(const complex&lt;T&gt;&amp;);
  template&lt;class T&gt;       T&amp; imag(      complex&lt;T&gt;&amp;);
</PRE>
<P>In 26.2.7 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.complex.value.ops">[lib.complex.value.ops]</A> 
paragraph 1, change</P><PRE>  template&lt;class T&gt; T real(const complex&lt;T&gt;&amp;);
</PRE>
<P>to</P><PRE>  template&lt;class T&gt; const T&amp; real(const complex&lt;T&gt;&amp;);
  template&lt;class T&gt;       T&amp; real(      complex&lt;T&gt;&amp;);
</PRE>
<P>and change the <B>Returns</B> clause to "<B>Returns:</B> The real part of 
<I>x</I></P>. 
<P>In 26.2.7 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.complex.value.ops">[lib.complex.value.ops]</A> 
paragraph 2, change</P><PRE>  template&lt;class T&gt; T imag(const complex&lt;T&gt;&amp;);
</PRE>
<P>to</P><PRE>  template&lt;class T&gt; const T&amp; imag(const complex&lt;T&gt;&amp;);
  template&lt;class T&gt;       T&amp; imag(      complex&lt;T&gt;&amp;);
</PRE>
<P>and change the <B>Returns</B> clause to "<B>Returns:</B> The imaginary part 
of <I>x</I></P>. 
<P><I>[Kona: The layout guarantee is absolutely necessary for C compatibility. 
However, there was disagreement about the other part of this proposal: 
retrieving elements of the complex number as lvalues. An alternative: continue 
to have real() and imag() return rvalues, but add set_real() and set_imag(). 
Straw poll: return lvalues - 2, add setter functions - 5. Related issue: do we 
want reinterpret_cast as the interface for converting a complex to an array of 
two reals, or do we want to provide a more explicit way of doing it? Howard will 
try to resolve this issue for the next meeting.]</I></P>
<P><I>[pre-Sydney: Howard summarized the options in n1589.]</I></P>
<P><B>Rationale:</B></P>
<P>The LWG believes that C99 compatibility would be enough justification for 
this change even without other considerations. All existing implementations 
already have the layout proposed here.</P>
<HR>
<A name=394>
<H3>394.&nbsp;behavior of formatted output on failure</H3></A>
<P><B>Section:</B>&nbsp;27.6.2.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream.formatted.reqmts">[lib.ostream.formatted.reqmts]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;27 Dec 2002</P>
<P>There is a contradiction in Formatted output about what bit is supposed to be 
set if the formatting fails. On sentence says it's badbit and another that it's 
failbit. </P>
<P>27.6.2.5.1, p1 says in the Common Requirements on Formatted output functions: 
<PRE>     ... If the generation fails, then the formatted output function
     does setstate(ios::failbit), which might throw an exception.
</PRE>
<P></P>
<P>27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters: </P>
<P>... The formatting conversion occurs as if it performed the following code 
fragment: </P>
<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();

     ... If failed is true then does setstate(badbit) ...
</PRE>
<P></P>
<P>The original intent of the text, according to Jerry Schwarz (see 
c++std-lib-10500), is captured in the following paragraph: </P>
<P>In general "badbit" should mean that the stream is unusable because of some 
underlying failure, such as disk full or socket closure; "failbit" should mean 
that the requested formatting wasn't possible because of some inconsistency such 
as negative widths. So typically if you clear badbit and try to output something 
else you'll fail again, but if you clear failbit and try to output something 
else you'll succeed. </P>
<P>In the case of the arithmetic inserters, since num_put cannot report failure 
by any means other than exceptions (in response to which the stream must set 
badbit, which prevents the kind of recoverable error reporting mentioned above), 
the only other detectable failure is if the iterator returned from num_put 
returns true from failed(). </P>
<P>Since that can only happen (at least with the required iostream 
specializations) under such conditions as the underlying failure referred to 
above (e.g., disk full), setting badbit would seem to be the appropriate 
response (indeed, it is required in 27.6.2.5.2, p1). It follows that failbit can 
never be directly set by the arithmetic (it can only be set by the sentry object 
under some unspecified conditions). </P>
<P>The situation is different for other formatted output functions which can 
fail as a result of the streambuf functions failing (they may do so by means 
other than exceptions), and which are then required to set failbit. </P>
<P>The contradiction, then, is that ostream::operator&lt;&lt;(int) will set 
badbit if the disk is full, while operator&lt;&lt;(ostream&amp;, char) will set 
failbit under the same conditions. To make the behavior consistent, the Common 
requirements sections for the Formatted output functions should be changed as 
proposed below. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: There's agreement that this is a real issue. What we decided at 
Kona: 1. An error from the buffer (which can be detected either directly from 
streambuf's member functions or by examining a streambuf_iterator) should always 
result in badbit getting set. 2. There should never be a circumstance where 
failbit gets set. That represents a formatting error, and there are no 
circumstances under which the output facets are specified as signaling a 
formatting error. (Even more so for string output that for numeric because 
there's nothing to format.) If we ever decide to make it possible for formatting 
errors to exist then the facets can signal the error directly, and that should 
go in clause 22, not clause 27. 3. The phrase "if generation fails" is unclear 
and should be eliminated. It's not clear whether it's intended to mean a buffer 
error (e.g. a full disk), a formatting error, or something else. Most people 
thought it was supposed to refer to buffer errors; if so, we should say so. 
Martin will provide wording.]</I></P>
<P><B>Rationale:</B></P>
<HR>
<A name=396>
<H3>396.&nbsp;what are characters zero and one</H3></A>
<P><B>Section:</B>&nbsp;23.3.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.cons">[lib.bitset.cons]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;5 Jan 2003</P>
<P>23.3.5.1, p6 [lib.bitset.cons] talks about a generic character having the 
value of 0 or 1 but there is no definition of what that means for charT other 
than char and wchar_t. And even for those two types, the values 0 and 1 are not 
actually what is intended -- the values '0' and '1' are. This, along with the 
converse problem in the description of to_string() in 23.3.5.2, p33, looks like 
a defect remotely related to DR 303. </P>
<P>http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303 </P><PRE>23.3.5.1:
  -6-  An element of the constructed string has value zero if the
       corresponding character in str, beginning at position pos,
       is 0. Otherwise, the element has the value one.
    </PRE><PRE>23.3.5.2:
  -33-  Effects: Constructs a string object of the appropriate
        type and initializes it to a string of length N characters.
        Each character is determined by the value of its
        corresponding bit position in *this. Character position N
        ?- 1 corresponds to bit position zero. Subsequent decreasing
        character positions correspond to increasing bit positions.
        Bit value zero becomes the character 0, bit value one becomes
        the character 1.
    </PRE>
<P>Also note the typo in 23.3.5.1, p6: the object under construction is a 
bitset, not a string. </P>
<P><B>Proposed resolution:</B></P>
<P>Change the constructor's function declaration immediately before 23.3.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.cons">[lib.bitset.cons]</A> 
p3 to:</P><PRE>    template &lt;class charT, class traits, class Allocator&gt;
    explicit
    bitset(const basic_string&lt;charT, traits, Allocator&gt;&amp; str,
           typename basic_string&lt;charT, traits, Allocator&gt;::size_type pos = 0,
           typename basic_string&lt;charT, traits, Allocator&gt;::size_type n =
             basic_string&lt;charT, traits, Allocator&gt;::npos,
           charT zero = charT('0'), charT one = charT('1'))
</PRE>
<P>Change the first two sentences of 23.3.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.cons">[lib.bitset.cons]</A> 
p6 to: "An element of the constructed string has value 0 if the corresponding 
character in <I>str</I>, beginning at position <I>pos</I>, is <I>zero</I>. 
Otherwise, the element has the value 1.</P>
<P>Change the text of the second sentence in 23.3.5.1, p5 to read: "The function 
then throws invalid_argument if any of the rlen characters in str beginning at 
position pos is other than <I>zero</I> or <I>one</I>. The function uses 
traits::eq() to compare the character values." </P>
<P>Change the declaration of the <TT>to_string</TT> member function immediately 
before 23.3.5.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.members">[lib.bitset.members]</A> 
p33 to:</P><PRE>    template &lt;class charT, class traits, class Allocator&gt;
    basic_string&lt;charT, traits, Allocator&gt; 
    to_string(charT zero = charT('0'), charT one = charT('1')) const;
</PRE>
<P>Change the last sentence of 23.3.5.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.members">[lib.bitset.members]</A> 
p33 to: "Bit value 0 becomes the character <TT><I>zero</I></TT>, bit value 1 
becomes the character <TT><I>one</I></TT>.</P>
<P>Change 23.3.5.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.operators">[lib.bitset.operators]</A> 
p8 to:</P>
<P><B>Returns</B>:</P><PRE>  os &lt;&lt; x.template to_string&lt;charT,traits,allocator&lt;charT&gt; &gt;(
      use_facet&lt;ctype&lt;charT&gt; &gt;(<I>os</I>.getloc()).widen('0'),
      use_facet&lt;ctype&lt;charT&gt; &gt;(<I>os</I>.getloc()).widen('1'));
</PRE>
<P><B>Rationale:</B></P>
<P>There is a real problem here: we need the character values of '0' and '1', 
and we have no way to get them since strings don't have imbued locales. In 
principle the "right" solution would be to provide an extra object, either a 
ctype facet or a full locale, which would be used to widen '0' and '1'. However, 
there was some discomfort about using such a heavyweight mechanism. The proposed 
resolution allows those users who care about this issue to get it right.</P>
<P>We fix the inserter to use the new arguments. Note that we already fixed the 
analogous problem with the extractor in issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#303">303</A>.</P>
<HR>
<A name=397>
<H3>397.&nbsp;ostream::sentry dtor throws exceptions</H3></A>
<P><B>Section:</B>&nbsp;27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;5 Jan 2003</P>
<P>17.4.4.8, p3 prohibits library dtors from throwing exceptions. </P>
<P>27.6.2.3, p4 says this about the ostream::sentry dtor: </P><PRE>    -4- If ((os.flags() &amp; ios_base::unitbuf) &amp;&amp; !uncaught_exception())
        is true, calls os.flush().
    </PRE>
<P>27.6.2.6, p7 that describes ostream::flush() says: </P><PRE>    -7- If rdbuf() is not a null pointer, calls rdbuf()-&gt;pubsync().
        If that function returns ?-1 calls setstate(badbit) (which
        may throw ios_base::failure (27.4.4.3)).
    </PRE>
<P>That seems like a defect, since both pubsync() and setstate() can throw an 
exception. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[ The contradiction is real. Clause 17 says destructors may never throw 
exceptions, and clause 27 specifies a destructor that does throw. In principle 
we might change either one. We're leaning toward changing clause 17: putting in 
an "unless otherwise specified" clause, and then putting in a footnote saying 
the sentry destructor is the only one that can throw. PJP suggests specifying 
that sentry::~sentry() should internally catch any exceptions it might cause. 
]</I></P>
<HR>
<A name=398>
<H3>398.&nbsp;effects of end-of-file on unformatted input functions</H3></A>
<P><B>Section:</B>&nbsp;27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;5 Jan 2003</P>
<P>While reviewing unformatted input member functions of istream for their 
behavior when they encounter end-of-file during input I found that the 
requirements vary, sometimes unexpectedly, and in more than one case even 
contradict established practice (GNU libstdc++ 3.2, IBM VAC++ 6.0, STLPort 4.5, 
SunPro 5.3, HP aCC 5.38, Rogue Wave libstd 3.1, and Classic Iostreams). </P>
<P>The following unformatted input member functions set eofbit if they encounter 
an end-of-file (this is the expected behavior, and also the behavior of all 
major implementations): </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    get (char_type*, streamsize, char_type);
    </PRE>
<P></P>
<P>Also sets failbit if it fails to extract any characters. </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    get (char_type*, streamsize);
    </PRE>
<P></P>
<P>Also sets failbit if it fails to extract any characters. </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    getline (char_type*, streamsize, char_type);
    </PRE>
<P></P>
<P>Also sets failbit if it fails to extract any characters. </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    getline (char_type*, streamsize);
    </PRE>
<P></P>
<P>Also sets failbit if it fails to extract any characters. </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    ignore (int, int_type);
    </PRE>
<P></P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    read (char_type*, streamsize);
    </PRE>
<P></P>
<P>Also sets failbit if it encounters end-of-file. </P>
<P><PRE>    streamsize readsome (char_type*, streamsize);
    </PRE>
<P></P>
<P>The following unformated input member functions set failbit but not eofbit if 
they encounter an end-of-file (I find this odd since the functions make it 
impossible to distinguish a general failure from a failure due to end-of-file; 
the requirement is also in conflict with all major implementation which set both 
eofbit and failbit): </P>
<P><PRE>    int_type get();
    </PRE>
<P></P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    get (char_type&amp;);
    </PRE>
<P></P>
<P>These functions only set failbit of they extract no characters, otherwise 
they don't set any bits, even on failure (I find this inconsistency quite 
unexpected; the requirement is also in conflict with all major implementations 
which set eofbit whenever they encounter end-of-file): </P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    get (basic_streambuf&lt;charT, traits&gt;&amp;, char_type);
    </PRE>
<P></P>
<P><PRE>    basic_istream&lt;charT, traits&gt;&amp;
    get (basic_streambuf&lt;charT, traits&gt;&amp;);
    </PRE>
<P></P>
<P>This function sets no bits (all implementations except for STLport and 
Classic Iostreams set eofbit when they encounter end-of-file): </P>
<P><PRE>    int_type peek ();
    </PRE>
<P></P>
<P><B>Proposed resolution:</B></P>
<P>Informally, what we want is a global statement of intent saying that eofbit 
gets set if we trip across EOF, and then we can take away the specific wording 
for individual functions. A full review is necessary. The wording currently in 
the standard is a mishmash, and changing it on an individual basis wouldn't make 
things better. Dietmar will do this work.</P>
<HR>
<A name=401>
<H3>401.&nbsp; incorrect type casts in table 32 in 
lib.allocator.requirements</H3></A>
<P><B>Section:</B>&nbsp;20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Markus Mauhart&nbsp; <B>Date:</B>&nbsp;27 Feb 2003</P>
<P>I think that in par2 of 20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A> 
the last two lines of table 32 contain two incorrect type casts. The lines are 
... </P><PRE>  a.construct(p,t)   Effect: new((void*)p) T(t)
  a.destroy(p)       Effect: ((T*)p)?-&gt;~T()
</PRE>
<P>.... with the prerequisits coming from the preceding two paragraphs, 
especially from table 31: </P><PRE>  alloc&lt;T&gt;             a     ;// an allocator for T
  alloc&lt;T&gt;::pointer    p     ;// random access iterator
                              // (may be different from T*)
  alloc&lt;T&gt;::reference  r = *p;// T&amp;
  T const&amp;             t     ;
</PRE>
<P>For that two type casts ("(void*)p" and "(T*)p") to be well-formed this would 
require then conversions to T* and void* for all alloc&lt;T&gt;::pointer, so it 
would implicitely introduce extra requirements for alloc&lt;T&gt;::pointer, 
additionally to the only current requirement (being a random access iterator). 
</P>
<P><B>Proposed resolution:</B></P>
<P>"(void*)p" should be replaced with "(void*)&amp;*p" and that "((T*)p)?-&gt;" 
should be replaced with "(*p)." or with "(&amp;*p)-&gt;". </P>
<P>Note: Actually I would prefer to replace "((T*)p)?-&gt;dtor_name" with 
"p?-&gt;dtor_name", but AFAICS this is not possible cause of an omission in 
13.5.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/over.html#over.ref">[over.ref]</A> 
(for which I have filed another DR on 29.11.2002). </P>
<P><I>[Kona: The LWG thinks this is somewhere on the border between Open and 
NAD. The intend is clear: <TT>construct</TT> constructs an object at the 
location <I>p</I>. It's reading too much into the description to think that 
literally calling <TT>new</TT> is required. Tweaking this description is low 
priority until we can do a thorough review of allocators, and, in particular, 
allocators with non-default pointer types.]</I></P>
<HR>
<A name=405>
<H3>405.&nbsp;qsort and POD</H3></A>
<P><B>Section:</B>&nbsp;25.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.c.library">[lib.alg.c.library]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Ray Lischner&nbsp; <B>Date:</B>&nbsp;08 Apr 2003</P>
<P>Section 25.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.c.library">[lib.alg.c.library]</A> 
describes bsearch and qsort, from the C standard library. Paragraph 4 does not 
list any restrictions on qsort, but it should limit the base parameter to point 
to POD. Presumably, qsort sorts the array by copying bytes, which requires POD. 
</P>
<P><B>Proposed resolution:</B></P>
<P>In 25.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.c.library">[lib.alg.c.library]</A> 
paragraph 4, just after the declarations and before the nonnormative note, add 
these words: "both of which have the same behavior as the original declaration. 
The behavior is undefined unless the objects in the array pointed to by 
<I>base</I> are of POD type." </P>
<P><I>[Something along these lines is clearly necessary. Matt provided 
wording.]</I></P>
<HR>
<A name=406>
<H3>406.&nbsp;vector::insert(s) exception safety</H3></A>
<P><B>Section:</B>&nbsp;23.2.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector.modifiers">[lib.vector.modifiers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;27 Apr 2003</P>
<P>There is a possible defect in the standard: the standard text was never 
intended to prevent arbitrary ForwardIterators, whose operations may throw 
exceptions, from being passed, and it also wasn't intended to require a 
temporary buffer in the case where ForwardIterators were passed (and I think 
most implementations don't use one). As is, the standard appears to impose 
requirements that aren't met by any existing implementation. </P>
<P><B>Proposed resolution:</B></P>
<P>Replace 23.2.4.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector.capacity">[lib.vector.capacity]</A> 
paragraph 1 with:</P>
<BLOCKQUOTE>1- Notes: Causes reallocation if the new size is greater than the 
  old capacity. If no reallocation happens, all the iterators and references 
  before the insertion point remain valid. If an exception is thrown other than 
  by the copy constructor or assignment operator of T or by any InputIterator 
  operation there are no effects. </BLOCKQUOTE>
<P><I>[We probably need to say something similar for deque.]</I></P>
<HR>
<A name=408>
<H3>408.&nbsp;Is vector&lt;reverse_iterator&lt;char*&gt; &gt; 
forbidden?</H3></A>
<P><B>Section:</B>&nbsp;24.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Nathan Myers&nbsp; <B>Date:</B>&nbsp;3 June 2003</P>
<P>I've been discussing iterator semantics with Dave Abrahams, and a surprise 
has popped up. I don't think this has been discussed before. </P>
<P>24.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</A> 
says that the only operation that can be performed on "singular" iterator values 
is to assign a non-singular value to them. (It doesn't say they can be 
destroyed, and that's probably a defect.) Some implementations have taken this 
to imply that there is no need to initialize the data member of a 
reverse_iterator&lt;&gt; in the default constructor. As a result, code like </P>
<BLOCKQUOTE>std::vector&lt;std::reverse_iterator&lt;char*&gt; &gt; v(7); 
  v.reserve(1000); </BLOCKQUOTE>
<P>invokes undefined behavior, because it must default-initialize the vector 
elements, and then copy them to other storage. Of course many other vector 
operations on these adapters are also left undefined, and which those are is not 
reliably deducible from the standard. </P>
<P>I don't think that 24.1 was meant to make standard-library iterator types 
unsafe. Rather, it was meant to restrict what operations may be performed by 
functions which take general user- and standard iterators as arguments, so that 
raw pointers would qualify as iterators. However, this is not clear in the text, 
others have come to the opposite conclusion. </P>
<P>One question is whether the standard iterator adaptors have defined copy 
semantics. Another is whether they have defined destructor semantics: is </P>
<BLOCKQUOTE>{ std::vector&lt;std::reverse_iterator&lt;char*&gt; &gt; v(7); } 
</BLOCKQUOTE>
<P>undefined too? </P>
<P>Note this is not a question of whether algorithms are allowed to rely on copy 
semantics for arbitrary iterators, just whether the types we actually supply 
support those operations. I believe the resolution must be expressed in terms of 
the semantics of the adapter's argument type. It should make clear that, e.g., 
the reverse_iterator&lt;T&gt; constructor is actually required to execute T(), 
and so copying is defined if the result of T() is copyable. </P>
<P>Issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#235">235</A>, 
which defines reverse_iterator's default constructor more precisely, has some 
relevance to this issue. However, it is not the whole story. </P>
<P>The issue was whether </P>
<BLOCKQUOTE>reverse_iterator() { } </BLOCKQUOTE>
<P>is allowed, vs. </P>
<BLOCKQUOTE>reverse_iterator() : current() { } </BLOCKQUOTE>
<P>The difference is when T is char*, where the first leaves the member 
uninitialized, and possibly equal to an existing pointer value, or (on some 
targets) may result in a hardware trap when copied. </P>
<P>8.5 paragraph 5 seems to make clear that the second is required to satisfy DR 
<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#235">235</A>, 
at least for non-class Iterator argument types. </P>
<P>But that only takes care of reverse_iterator, and doesn't establish a policy 
for all iterators. (The reverse iterator adapter was just an example.) In 
particular, does my function </P>
<BLOCKQUOTE>template &lt;typename Iterator&gt; void f() { 
  std::vector&lt;Iterator&gt; v(7); } </BLOCKQUOTE>
<P>evoke undefined behavior for some conforming iterator definitions? I think it 
does, now, because vector&lt;&gt; will destroy those singular iterator values, 
and that's explicitly disallowed. </P>
<P>24.1 shouldn't give blanket permission to copy all singular iterators, 
because then pointers wouldn't qualify as iterators. However, it should allow 
copying of that subset of singular iterator values that are default-initialized, 
and it should explicitly allow destroying any iterator value, singular or not, 
default-initialized or not. </P>
<P>Related issue: <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#407">407</A></P>
<P><B>Proposed resolution:</B></P>
<P><I>[ We don't want to require all singular iterators to be copyable, because 
that is not the case for pointers. However, default construction may be a 
special case. Issue: is it really default construction we want to talk about, or 
is it something like value initialization? We need to check with core to see 
whether default constructed pointers are required to be copyable; if not, it 
would be wrong to impose so strict a requirement for iterators. ]</I></P>
<HR>
<A name=409>
<H3>409.&nbsp;Closing an fstream should clear error state</H3></A>
<P><B>Section:</B>&nbsp;27.8.1.7 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ifstream.members">[lib.ifstream.members]</A>, 
27.8.1.10 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ofstream.members">[lib.ofstream.members]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Nathan Myers&nbsp; <B>Date:</B>&nbsp;3 June 2003</P>
<P>A strict reading of 27.8.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fstreams">[lib.fstreams]</A> 
shows that opening or closing a basic_[io]fstream does not affect the error 
bits. This means, for example, that if you read through a file up to EOF, and 
then close the stream and reopen it at the beginning of the file, the EOF bit in 
the stream's error state is still set. This is counterintuitive. </P>
<P>The LWG considered this issue once before, as issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#22">22</A>, 
and put in a footnote to clarify that the strict reading was indeed correct. We 
did that because we believed the standard was unambiguous and consistent, and 
that we should not make architectural changes in a TC. Now that we're working on 
a new revision of the language, those considerations no longer apply. </P>
<P><B>Proposed resolution:</B></P>
<P>Change 27.8.1.7 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ifstream.members">[lib.ifstream.members]</A>, 
para. 3 from:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode|in). If that function returns a null 
  pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: 
  (lib.iostate.flags)). </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode|in). If that function returns a null 
  pointer, calls setstate(failbit) (which may throw ios_base::failure [Footnote: 
  (lib.iostate.flags)), else calls clear(). </BLOCKQUOTE>
<P>Change 27.8.1.10 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ofstream.members">[lib.ofstream.members]</A>, 
para. 3 from:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode|out). If that function returns a 
  null pointer, calls setstate(failbit) (which may throw ios_base::failure 
  [Footnote: (lib.iostate.flags)). </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode|out). If that function returns a 
  null pointer, calls setstate(failbit) (which may throw ios_base::failure 
  [Footnote: (lib.iostate.flags)), else calls clear(). </BLOCKQUOTE>
<P>Change 27.8.1.13 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fstream.members">[lib.fstream.members]</A>, 
para. 3 from:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode), If that function returns a null 
  pointer, calls setstate(failbit), (which may throw ios_base::failure). 
  (lib.iostate.flags) ) </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Calls rdbuf()-&gt;open(s,mode), If that function returns a null 
  pointer, calls setstate(failbit), (which may throw ios_base::failure). 
  (lib.iostate.flags) ), else calls clear(). </BLOCKQUOTE>
<P><I>[Kona: the LWG agrees this is a good idea. Post-Kona: Bill provided 
wording. He suggests having open, not close, clear the error flags.]</I></P>
<P><I>[Post-Sydney: Howard provided a new proposed resolution. The old one 
didn't make sense because it proposed to fix this at the level of basic_filebuf, 
which doesn't have access to the stream's error state. Howard's proposed 
resolution fixes this at the level of the three fstream class template 
instead.]</I></P>
<HR>
<A name=410>
<H3>410.&nbsp;Missing semantics for stack and queue comparison 
operators</H3></A>
<P><B>Section:</B>&nbsp;23.2.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.queue">[lib.queue]</A>, 
23.2.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.stack">[lib.stack]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Hans Bos&nbsp; <B>Date:</B>&nbsp;7 Jun 2003</P>
<P>Sections 23.2.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.queue">[lib.queue]</A> 
and 23.2.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.stack">[lib.stack]</A> 
list comparison operators (==, !=, &lt;, &lt;=, &gt;, =&gt;) for queue and 
stack. Only the semantics for queue::operator== (23.2.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.queue">[lib.queue]</A> 
par2) and queue::operator&lt; (23.2.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.queue">[lib.queue]</A> 
par3) are defined. </P>
<P><B>Proposed resolution:</B></P>
<P>Add the following new paragraphs after 23.2.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.queue">[lib.queue]</A> 
paragraph 3:</P>
<BLOCKQUOTE><PRE>  operator!=
</PRE>
  <P>Returns: <TT>x.c != y.c</TT></P><PRE>  operator&gt;
</PRE>
  <P>Returns: <TT>x.c &gt; y.c</TT></P><PRE>  operator&lt;=
</PRE>
  <P>Returns: <TT>x.c &lt;= y.c</TT></P><PRE>  operator&gt;=
</PRE>
  <P>Returns: <TT>x.c &gt;= y.c</TT></P></BLOCKQUOTE>
<P>Add the following paragraphs at the end of 23.2.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.stack">[lib.stack]</A>:</P>
<BLOCKQUOTE><PRE>  operator==
</PRE>
  <P>Returns: <TT>x.c == y.c</TT></P><PRE>  operator&lt;
</PRE>
  <P>Returns: <TT>x.c &lt; y.c</TT></P><PRE>  operator!=
</PRE>
  <P>Returns: <TT>x.c != y.c</TT></P><PRE>  operator&gt;
</PRE>
  <P>Returns: <TT>x.c &gt; y.c</TT></P><PRE>  operator&lt;=
</PRE>
  <P>Returns: <TT>x.c &lt;= y.c</TT></P><PRE>  operator&gt;=
</PRE>
  <P>Returns: <TT>x.c &gt;= y.c</TT></P></BLOCKQUOTE>
<P><I>[Kona: Matt provided wording.]</I></P>
<P><B>Rationale:</B></P>There isn't any real doubt about what these operators 
are supposed to do, but we ought to spell it out. 
<HR>
<A name=412>
<H3>412.&nbsp;Typo in 27.4.4.3</H3></A>
<P><B>Section:</B>&nbsp;27.4.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostate.flags">[lib.iostate.flags]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;10 Jul 2003</P>
<P>The Effects clause in 27.4.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostate.flags">[lib.iostate.flags]</A> 
paragraph 5 says that the function only throws if the respective bits are 
already set prior to the function call. That's obviously not the intent. The 
typo ought to be corrected and the text reworded as: "If (<I>state</I> &amp; 
exceptions()) == 0, returns. ..." </P>
<P><B>Proposed resolution:</B></P>
<P>In 27.4.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostate.flags">[lib.iostate.flags]</A> 
paragraph 5, replace "If (rdstate() &amp; exceptions()) == 0" with "If ((state | 
(rdbuf() ? goodbit : badbit)) &amp; exceptions()) == 0". </P>
<P><I>[Kona: the original proposed resolution wasn't quite right. We really do 
mean rdstate(); the ambiguity is that the wording in the standard doesn't make 
it clear whether we mean rdstate() before setting the new state, or rdsate() 
after setting it. We intend the latter, of course. Post-Kona: Martin provided 
wording.]</I></P>
<HR>
<A name=413>
<H3>413.&nbsp;Proposed resolution to LDR#64 still wrong</H3></A>
<P><B>Section:</B>&nbsp;27.6.1.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream::extractors">[lib.istream::extractors]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bo Persson&nbsp; <B>Date:</B>&nbsp;13 Jul 2003</P>
<P>The second sentence of the proposed resolution says: </P>
<P>"If it inserted no characters because it caught an exception thrown while 
extracting characters from sb and ..." </P>
<P>However, we are not extracting from sb, but extracting from the basic_istream 
(*this) and inserting into sb. I can't really tell if "extracting" or "sb" is a 
typo. </P>
<P><I>[ Sydney: Definitely a real issue. We are, indeed, extracting characters 
from an istream and not from sb. The problem was there in the FDIS and wasn't 
fixed by issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#64">64</A>. 
Probably what was intended was to have *this instead of sb. We're talking about 
the exception flag state of a basic_istream object, and there's only one 
basic_istream object in this discussion, so that would be a consistent 
interpretation. (But we need to be careful: the exception policy of this member 
function must be consistent with that of other extractors.) PJP will provide 
wording. ]</I></P>
<P><B>Proposed resolution:</B></P>
<P>Change the sentence from:</P>
<BLOCKQUOTE>If it inserted no characters because it caught an exception thrown 
  while extracting characters from sb and failbit is on in exceptions(), then 
  the caught exception is rethrown. </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>If it inserted no characters because it caught an exception thrown 
  while extracting characters from *this and failbit is on in exceptions(), then 
  the caught exception is rethrown. </BLOCKQUOTE>
<HR>
<A name=415>
<H3>415.&nbsp;behavior of std::ws</H3></A>
<P><B>Section:</B>&nbsp;27.6.1.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream.manip">[lib.istream.manip]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>According to 27.6.1.4, the ws() manipulator is not required to construct the 
sentry object. The manipulator is also not a member function so the text in 
27.6.1, p1 through 4 that describes the exception policy for istream member 
functions does not apply. That seems inconsistent with the rest of extractors 
and all the other input functions (i.e., ws will not cause a tied stream to be 
flushed before extraction, it doesn't check the stream's exceptions or catch 
exceptions thrown during input, and it doesn't affect the stream's gcount). </P>
<P><B>Proposed resolution:</B></P>
<P>Add to 27.6.1.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream.manip">[lib.istream.manip]</A>, 
immediately before the first sentence of paragraph 1, the following text: </P>
<BLOCKQUOTE>Behaves as an unformatted input function (as described in 
  27.6.1.3, paragraph 1), except that it does not count the number of characters 
  extracted and does not affect the value returned by subsequent calls to 
  is.gcount(). After constructing a sentry object... </BLOCKQUOTE>
<P><I>[Post-Kona: Martin provided wording]</I></P>
<HR>
<A name=416>
<H3>416.&nbsp;definitions of XXX_MIN and XXX_MAX macros in climits</H3></A>
<P><B>Section:</B>&nbsp;18.2.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-support.html#lib.c.limits">[lib.c.limits]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>Given two overloads of the function foo(), one taking an argument of type int 
and the other taking a long, which one will the call foo(LONG_MAX) resolve to? 
The expected answer should be foo(long), but whether that is true depends on the 
#defintion of the LONG_MAX macro, specifically its type. This issue is about the 
fact that the type of these macros is not actually required to be the same as 
the the type each respective limit. <BR>Section 18.2.2 of the C++ Standard does 
not specify the exact types of the XXX_MIN and XXX_MAX macros #defined in the 
&lt;climits&gt; and &lt;limits.h&gt; headers such as INT_MAX and LONG_MAX and 
instead defers to the C standard. <BR>Section 5.2.4.2.1, p1 of the C standard 
specifies that "The values [of these constants] shall be replaced by constant 
expressions suitable for use in #if preprocessing directives. Moreover, except 
for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that 
have the same type as would an expression that is an object of the corresponding 
type converted according to the integer promotions." <BR>The "corresponding type 
converted according to the integer promotions" for LONG_MAX is, according to 
6.4.4.1, p5 of the C standard, the type of long converted to the first of the 
following set of types that can represent it: int, long int, long long int. So 
on an implementation where (sizeof(long) == sizeof(int)) this type is actually 
int, while on an implementation where (sizeof(long) &gt; sizeof(int)) holds this 
type will be long. <BR>This is not an issue in C since the type of the macro 
cannot be detected by any conforming C program, but it presents a portability 
problem in C++ where the actual type is easily detectable by overload 
resolution. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: the LWG does not believe this is a defect. The C macro definitions 
are what they are; we've got a better mechanism, <TT>std::numeric_limits</TT>, 
that is specified more precisely than the C limit macros. At most we should add 
a nonnormative note recommending that users who care about the exact types of 
limit quantities should use &lt;limits&gt; instead of &lt;climits&gt;.]</I></P>
<HR>
<A name=417>
<H3>417.&nbsp;what does ctype::do_widen() return on failure</H3></A>
<P><B>Section:</B>&nbsp;22.2.1.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.ctype.virtuals">[lib.locale.ctype.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The Effects and Returns clauses of the do_widen() member function of the 
ctype facet fail to specify the behavior of the function on failure. That the 
function may not be able to simply cast the narrow character argument to the 
type of the result since doing so may yield the wrong value for some wchar_t 
encodings. Popular implementations of ctype&lt;wchar_t&gt; that use mbtowc() and 
UTF-8 as the native encoding (e.g., GNU glibc) will fail when the argument's MSB 
is set. There is no way for the the rest of locale and iostream to reliably 
detect this failure. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: This is a real problem. Widening can fail. It's unclear what the 
solution should be. Returning WEOF works for the wchar_t specialization, but not 
in general. One option might be to add a default, like <I>narrow</I>. But that's 
an incompatible change. Using <I>traits::eof</I> might seem like a good idea, 
but facets don't have access to traits (a recurring problem). We could have 
<I>widen</I> throw an exception, but that's a scary option; existing library 
components aren't written with the assumption that <I>widen</I> can 
throw.]</I></P>
<HR>
<A name=418>
<H3>418.&nbsp;exceptions thrown during iostream cleanup</H3></A>
<P><B>Section:</B>&nbsp;27.4.2.1.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ios::Init">[lib.ios::Init]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The dtor of the ios_base::Init object is supposed to call flush() on the 6 
standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog. This call 
may cause an exception to be thrown. </P>
<P>17.4.4.8, p3 prohibits all library destructors from throwing exceptions. </P>
<P>The question is: What should this dtor do if one or more of these calls to 
flush() ends up throwing an exception? This can happen quite easily if one of 
the facets installed in the locale imbued in the iostream object throws. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: We probably can't do much better than what we've got, so the LWG is 
leaning toward NAD. At the point where the standard stream objects are being 
cleaned up, the usual error reporting mechanism are all unavailable. And 
exception from flush at this point will definitely cause problems. A quality 
implementation might reasonably swallow the exception, or call abort, or do 
something even more drastic.]</I></P>
<HR>
<A name=419>
<H3>419.&nbsp;istream extractors not setting failbit if eofbit is already 
set</H3></A>
<P><B>Section:</B>&nbsp;27.6.1.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.istream::sentry">[lib.istream::sentry]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>27.6.1.1.2, p2 says that istream::sentry ctor prepares for input if is.good() 
is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to 
true if the stream state is good after any preparation. 27.6.1.2.1, p1 then says 
that a formatted input function endeavors to obtain the requested input if the 
sentry's operator bool() returns true. Given these requirements, no formatted 
extractor should ever set failbit if the initial stream rdstate() == eofbit. 
That is contrary to the behavior of all implementations I tested. The program 
below prints out eof = 1, fail = 0 eof = 1, fail = 1 on all of them. </P><PRE>
#include &lt;sstream&gt;
#include &lt;cstdio&gt;

int main()
{
    std::istringstream strm ("1");

    int i = 0;

    strm &gt;&gt; i;

    std::printf ("eof = %d, fail = %d\n",
                 !!strm.eof (), !!strm.fail ());

    strm &gt;&gt; i;

    std::printf ("eof = %d, fail = %d\n",
                 !!strm.eof (), !!strm.fail ());
}

</PRE>
<P><BR>Comments from Jerry Schwarz (c++std-lib-11373): <BR>Jerry Schwarz wrote: 
<BR>I don't know where (if anywhere) it says it in the standard, but the 
formatted extractors are supposed to set failbit if they don't extract any 
characters. If they didn't then simple loops like <BR>while (cin &gt;&gt; x); 
<BR>would loop forever. <BR>Further comments from Martin Sebor: <BR>The question 
is which part of the extraction should prevent this from happening by setting 
failbit when eofbit is already set. It could either be the sentry object or the 
extractor. It seems that most implementations have chosen to set failbit in the 
sentry [...] so that's the text that will need to be corrected. </P>
<P><B>Proposed resolution:</B></P>
<P>Kona: Possibly NAD. If eofbit is set then good() will return false. We then 
set <I>ok</I> to false. We believe that the sentry's constructor should always 
set failbit when <I>ok</I> is false, and we also think the standard already says 
that. Possibly it could be clearer.</P>
<HR>
<A name=421>
<H3>421.&nbsp;is basic_streambuf copy-constructible?</H3></A>
<P><B>Section:</B>&nbsp;27.5.2.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.streambuf.cons">[lib.streambuf.cons]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The reflector thread starting with c++std-lib-11346 notes that the class 
template basic_streambuf, along with basic_stringbuf and basic_filebuf, is 
copy-constructible but that the semantics of the copy constructors are not 
defined anywhere. Further, different implementations behave differently in this 
respect: some prevent copy construction of objects of these types by declaring 
their copy ctors and assignment operators private, others exhibit undefined 
behavior, while others still give these operations well-defined semantics. </P>
<P>Note that this problem doesn't seem to be isolated to just the three types 
mentioned above. A number of other types in the library section of the standard 
provide a compiler-generated copy ctor and assignment operator yet fail to 
specify their semantics. It's believed that the only types for which this is 
actually a problem (i.e. types where the compiler-generated default may be 
inappropriate and may not have been intended) are locale facets. See issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-closed.html#439">439</A>. 
</P>
<P><B>Proposed resolution:</B></P>
<P>27.5.2 [lib.streambuf]: Add into the synopsis, public section, just above the 
destructor declaration: </P>
<BLOCKQUOTE><PRE>basic_streambuf(const basic_streambuf&amp; sb);
basic_streambuf&amp; operator=(const basic_streambuf&amp; sb);
</PRE></BLOCKQUOTE>
<P>Insert after 27.5.2.1, paragraph 2:</P>
<BLOCKQUOTE><PRE>basic_streambuf(const basic_streambuf&amp; sb);
</PRE>
  <P>Constructs a copy of sb.</P>
  <P>Postcondtions:</P><PRE>                eback() == sb.eback()
                gptr()  == sb.gptr()
                egptr() == sb.egptr()
                pbase() == sb.pbase()
                pptr()  == sb.pptr()
                epptr() == sb.epptr()
                getloc() == sb.getloc()
</PRE><PRE>basic_streambuf&amp; operator=(const basic_streambuf&amp; sb);
</PRE>
  <P>Assigns the data members of sb to this.</P>
  <P>Postcondtions:</P><PRE>                eback() == sb.eback()
                gptr()  == sb.gptr()
                egptr() == sb.egptr()
                pbase() == sb.pbase()
                pptr()  == sb.pptr()
                epptr() == sb.epptr()
                getloc() == sb.getloc()
</PRE>
  <P>Returns: *this.</P></BLOCKQUOTE>
<P>27.7.1 [lib.stringbuf]:</P><B>Option A:</B> 
<BLOCKQUOTE>
  <P>Insert into the basic_stringbuf synopsis in the private section:</P><PRE>basic_stringbuf(const basic_stringbuf&amp;);             // not defined
basic_stringbuf&amp; operator=(const basic_stringbuf&amp;);  // not defined
</PRE></BLOCKQUOTE><B>Option B:</B> 
<BLOCKQUOTE>
  <P>Insert into the basic_stringbuf synopsis in the public section:</P><PRE>basic_stringbuf(const basic_stringbuf&amp; sb);
basic_stringbuf&amp; operator=(const basic_stringbuf&amp; sb);
</PRE>
  <P>27.7.1.1, insert after paragraph 4:</P><PRE>basic_stringbuf(const basic_stringbuf&amp; sb);</PRE>
  <P>Constructs an independent copy of sb as if with sb.str(), and with the 
  openmode that sb was constructed with. </P>
  <P>Postcondtions: </P><PRE>               str() == sb.str()
               gptr()  - eback() == sb.gptr()  - sb.eback()
               egptr() - eback() == sb.egptr() - sb.eback()
               pptr()  - pbase() == sb.pptr()  - sb.pbase()
               getloc() == sb.getloc()
</PRE>
  <P>Note: The only requirement on epptr() is that it point beyond the 
  initialized range if an output sequence exists. There is no requirement that 
  epptr() - pbase() == sb.epptr() - sb.pbase(). </P><PRE>basic_stringbuf&amp; operator=(const basic_stringbuf&amp; sb);</PRE>
  <P>After assignment the basic_stringbuf has the same state as if it were 
  initially copy constructed from sb, except that the basic_stringbuf is allowed 
  to retain any excess capacity it might have, which may in turn effect the 
  value of epptr(). </P></BLOCKQUOTE>
<P>27.8.1.1 [lib.filebuf]</P>
<P>Insert at the bottom of the basic_filebuf synopsis:</P>
<BLOCKQUOTE><PRE>private:
  basic_filebuf(const basic_filebuf&amp;);             // not defined
  basic_filebuf&amp; operator=(const basic_filebuf&amp;);  // not defined
</PRE></BLOCKQUOTE>
<P><I>[Kona: this is an issue for basic_streambuf itself and for its derived 
classes. We are leaning toward allowing basic_streambuf to be copyable, and 
specifying its precise semantics. (Probably the obvious: copying the buffer 
pointers.) We are less sure whether the streambuf derived classes should be 
copyable. Howard will write up a proposal.]</I></P>
<P><I>[Sydney: Dietmar presented a new argument against basic_streambuf being 
copyable: it can lead to an encapsulation violation. Filebuf inherits from 
streambuf. Now suppose you inhert a my_hijacking_buf from streambuf. You can 
copy the streambuf portion of a filebuf to a my_hijacking_buf, giving you access 
to the pointers into the filebuf's internal buffer. Perhaps not a very strong 
argument, but it was strong enough to make people nervous. There was weak 
preference for having streambuf not be copyable. There was weak preference for 
having stringbuf not be copyable even if streambuf is. Move this issue to open 
for now. ]</I></P>
<P><B>Rationale:</B></P>
<P>27.5.2 [lib.streambuf]: The proposed basic_streambuf copy constructor and 
assignment operator are the same as currently implied by the lack of 
declarations: public and simply copies the data members. This resolution is not 
a change but a clarification of the current standard. </P>
<P>27.7.1 [lib.stringbuf]: There are two reasonable options: A) Make 
basic_stringbuf not copyable. This is likely the status-quo of current 
implementations. B) Reasonable copy semantics of basic_stringbuf can be defined 
and implemented. A copyable basic_streambuf is arguably more useful than a 
non-copyable one. This should be considered as new functionality and not the 
fixing of a defect. If option B is chosen, ramifications from issue 432 are 
taken into account. </P>
<P>27.8.1.1 [lib.filebuf]: There are no reasonable copy semantics for 
basic_filebuf. </P>
<HR>
<A name=422>
<H3>422.&nbsp;explicit specializations of member functions of class 
templates</H3></A>
<P><B>Section:</B>&nbsp;17.4.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.reserved.names">[lib.reserved.names]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>It has been suggested that 17.4.3.1, p1 may or may not allow programs to 
explicitly specialize members of standard templates on user-defined types. The 
answer to the question might have an impact where library requirements are given 
using the "as if" rule. I.e., if programs are allowed to specialize member 
functions they will be able to detect an implementation's strict conformance to 
Effects clauses that describe the behavior of the function in terms of the other 
member function (the one explicitly specialized by the program) by relying on 
the "as if" rule. </P>
<P><B>Proposed resolution:</B></P>
<P>Add the following sentence immediately after the text of 17.4.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.reserved.names">[lib.reserved.names]</A>, 
p1: </P>
<BLOCKQUOTE>The behavior of a program that declares explicit specializations 
  of any members of class templates or explicit specializations of any member 
  templates of classes or class templates defined in this library is undefined. 
</BLOCKQUOTE>
<P><I>[Kona: straw poll was 6-1 that user programs should not be allowed to 
specialize individual member functions of standard library class templates, and 
that doing so invokes undefined behavior. Post-Kona: Martin provided 
wording.]</I></P>
<P><I>[Sydney: The LWG agrees that the standard shouldn't permit users to 
specialize individual member functions unless they specialize the whole class, 
but we're not sure these words say what we want them to; they could be read as 
prohibiting the specialization of any standard library class templates. We need 
to consult with CWG to make sure we use the right wording.]</I></P>
<HR>
<A name=423>
<H3>423.&nbsp;effects of negative streamsize in iostreams</H3></A>
<P><B>Section:</B>&nbsp;27 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.input.output">[lib.input.output]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>A third party test suite tries to exercise istream::ignore(N) with a negative 
value of N and expects that the implementation will treat N as if it were 0. Our 
implementation asserts that (N &gt;= 0) holds and aborts the test. </P>
<P>I can't find anything in section 27 that prohibits such values but I don't 
see what the effects of such calls should be, either (this applies to a number 
of unformatted input functions as well as some member functions of the 
basic_streambuf template). </P>
<P><B>Proposed resolution:</B></P>
<P>I propose that we add to each function in clause 27 that takes an argument, 
say N, of type streamsize a Requires clause saying that "N &gt;= 0." The intent 
is to allow negative streamsize values in calls to precision() and width() but 
disallow it in calls to streambuf::sgetn(), istream::ignore(), or 
ostream::write(). </P>
<P><I>[Kona: The LWG agreed that this is probably what we want. However, we need 
a review to find all places where functions in clause 27 take arguments of type 
streamsize that shouldn't be allowed to go negative. Martin will do that 
review.]</I></P>
<HR>
<A name=424>
<H3>424.&nbsp;normative notes</H3></A>
<P><B>Section:</B>&nbsp;17.3.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.structure.summary">[lib.structure.summary]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The text in 17.3.1.1, p1 says: <BR>"Paragraphs labelled "Note(s):" or 
"Example(s):" are informative, other paragraphs are normative." <BR>The library 
section makes heavy use of paragraphs labeled "Notes(s)," some of which are 
clearly intended to be normative (see list 1), while some others are not (see 
list 2). There are also those where the intent is not so clear (see list 3). 
<BR>List 1 -- Examples of (presumably) normative Notes: <BR>20.4.1.1, p3, 
20.4.1.1, p10, 21.3.1, p11, 22.1.1.2, p11, 23.2.1.3, p2, 25.3.7, p3, 26.2.6, 
p14a, 27.5.2.4.3, p7. <BR>List 2 -- Examples of (presumably) informative Notes: 
<BR>18.4.1.3, p3, 21.3.5.6, p14, 22.2.1.5.2, p3, 25.1.1, p4, 26.2.5, p1, 
27.4.2.5, p6. <BR>List 3 -- Examples of Notes that are not clearly either 
normative or informative: <BR>22.1.1.2, p8, 22.1.1.5, p6, 27.5.2.4.5, p4. 
<BR>None of these lists is meant to be exhaustive. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Definitely a real problem. The big problem is there's material that 
doesn't quite fit any of the named paragraph categories (e.g. <B>Effects</B>). 
Either we need a new kind of named paragraph, or we need to put more material in 
unnamed paragraphs jsut after the signature. We need to talk to the Project 
Editor about how to do this. ]</I></P>
<HR>
<A name=425>
<H3>425.&nbsp;return value of std::get_temporary_buffer</H3></A>
<P><B>Section:</B>&nbsp;20.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.temporary.buffer">[lib.temporary.buffer]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The standard is not clear about the requirements on the value returned from a 
call to get_temporary_buffer(0). In particular, it fails to specify whether the 
call should return a distinct pointer each time it is called (like operator 
new), or whether the value is unspecified (as if returned by malloc). The 
standard also fails to mention what the required behavior is when the argument 
is less than 0. </P>
<P><B>Proposed resolution:</B></P>
<P>Change 20.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.temporary.buffer">[lib.temporary.buffer]</A> 
paragraph 2 from "...or a pair of 0 values if no storage can be obtained" to 
"...or a pair of 0 values if no storage can be obtained or if <I>n</I> &lt;= 
0."</P>
<P><I>[Kona: Matt provided wording]</I></P>
<HR>
<A name=426>
<H3>426.&nbsp;search_n(), fill_n(), and generate_n() with negative n</H3></A>
<P><B>Section:</B>&nbsp;25.1.9 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.search">[lib.alg.search]</A>, 
25.2.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.fill">[lib.alg.fill]</A>, 
25.2.6 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.generate">[lib.alg.generate]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The complexity requirements for these function templates are incorrect (or 
don't even make sense) for negative n:</P>
<P>25.1.9, p7 (search_n): <BR>Complexity: At most (last1 - first1) * count 
applications of the corresponding predicate.</P>
<P>25.2.5, p3 (fill_n): <BR>Complexity: Exactly last - first (or n) 
assignments.</P><BR>
<P>25.2.6, p3 (generate_n): <BR>Complexity: Exactly last - first (or n) 
assignments.</P>
<P>In addition, the Requirements or the Effects clauses for the latter two 
templates don't say anything about the behavior when n is negative. </P>
<P><B>Proposed resolution:</B></P>
<P>Change 25.1.9, p7 to</P>
<BLOCKQUOTE>Complexity: At most (last1 - first1) * count applications of the 
  corresponding predicate if count is positive, or 0 otherwise. </BLOCKQUOTE>
<P>Change 25.2.5, p2 to</P>
<BLOCKQUOTE>Effects: Assigns value through all the iterators in the range 
  [first, last), or [first, first + n) if n is positive, none otherwise. 
</BLOCKQUOTE>
<P>Change 25.2.5, p3 to:</P>
<BLOCKQUOTE>Complexity: Exactly last - first (or n if n is positive, or 0 
  otherwise) assignments. </BLOCKQUOTE>
<P>Change 25.2.6, p1 to (notice the correction for the misspelled "through"): 
</P>
<BLOCKQUOTE>Effects: Invokes the function object genand assigns the return 
  value of gen through all the iterators in the range [first, last), or [first, 
  first + n) if n is positive, or [first, first) otherwise. </BLOCKQUOTE>
<P>Change 25.2.6, p3 to:</P>
<BLOCKQUOTE>Complexity: Exactly last - first (or n if n is positive, or 0 
  otherwise) assignments. </BLOCKQUOTE>
<P><B>Rationale:</B></P>
<P>Informally, we want to say that whenever we see a negative number we treat it 
the same as if it were zero. We believe the above changes do that (although they 
may not be the minimal way of saying so). The LWG considered and rejected the 
alternative of saying that negative numbers are undefined behavior.</P>
<HR>
<A name=427>
<H3>427.&nbsp;stage 2 and rationale of DR 221</H3></A>
<P><B>Section:</B>&nbsp;22.2.2.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The requirements specified in Stage 2 and reiterated in the rationale of DR 
221 (and echoed again in DR 303) specify that num_get&lt;charT&gt;:: do_get() 
compares characters on the stream against the widened elements of 
"012...abc...ABCX+-" </P>
<P>An implementation is required to allow programs to instantiate the num_get 
template on any charT that satisfies the requirements on a user-defined 
character type. These requirements do not include the ability of the character 
type to be equality comparable (the char_traits template must be used to perform 
tests for equality). Hence, the num_get template cannot be implemented to 
support any arbitrary character type. The num_get template must either make the 
assumption that the character type is equality-comparable (as some popular 
implementations do), or it may use char_traits&lt;charT&gt; to do the 
comparisons (some other popular implementations do that). This diversity of 
approaches makes it difficult to write portable programs that attempt to 
instantiate the num_get template on user-defined types. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: the heart of the problem is that we're theoretically supposed to 
use traits classes for all fundamental character operations like assignment and 
comparison, but facets don't have traits parameters. This is a fundamental 
design flaw and it appears all over the place, not just in this one place. It's 
not clear what the correct solution is, but a thorough review of facets and 
traits is in order. The LWG considered and rejected the possibility of changing 
numeric facets to use narrowing instead of widening. This may be a good idea for 
other reasons (see issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#459">459</A>), 
but it doesn't solve the problem raised by this issue. Whether we use widen or 
narrow the <TT>num_get</TT> facet still has no idea which traits class the user 
wants to use for the comparison, because only streams, not facets, are passed 
traits classes. The standard does not require that two different traits classes 
with the same <TT>char_type</TT> must necessarily have the same 
behavior.]</I></P>
<P>Informally, one possibility: require that some of the basic character 
operations, such as <TT>eq</TT>, <TT>lt</TT>, and <TT>assign</TT>, must behave 
the same way for all traits classes with the same <TT>char_type</TT>. If we 
accept that limitation on traits classes, then the facet could reasonably be 
required to use <TT>char_traits&lt;charT&gt;</TT></P>. 
<HR>
<A name=430>
<H3>430.&nbsp;valarray subset operations</H3></A>
<P><B>Section:</B>&nbsp;26.3.2.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-numerics.html#lib.valarray.sub">[lib.valarray.sub]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;18 Sep 2003</P>
<P>The standard fails to specify the behavior of valarray::operator[](slice) and 
other valarray subset operations when they are passed an "invalid" slice object, 
i.e., either a slice that doesn't make sense at all (e.g., slice (0, 1, 0) or 
one that doesn't specify a valid subset of the valarray object (e.g., slice (2, 
1, 1) for a valarray of size 1). </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: the LWG believes that invalid slices should invoke undefined 
behavior. Valarrays are supposed to be designed for high performance, so we 
don't want to require specific checking. We need wording to express this 
decision.]</I></P>
<HR>
<A name=431>
<H3>431.&nbsp;Swapping containers with unequal allocators</H3></A>
<P><B>Section:</B>&nbsp;20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A>, 
25 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.algorithms">[lib.algorithms]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Matt Austern&nbsp; <B>Date:</B>&nbsp;20 Sep 2003</P>
<P>Clause 20.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.allocator.requirements">[lib.allocator.requirements]</A> 
paragraph 4 says that implementations are permitted to supply containers that 
are unable to cope with allocator instances and that container implementations 
may assume that all instances of an allocator type compare equal. We gave 
implementers this latitude as a temporary hack, and eventually we want to get 
rid of it. What happens when we're dealing with allocators that <I>don't</I> 
compare equal? </P>
<P>In particular: suppose that <TT>v1</TT> and <TT>v2</TT> are both objects of 
type <TT>vector&lt;int, my_alloc&gt;</TT> and that <TT>v1.get_allocator() != 
v2.get_allocator()</TT>. What happens if we write <TT>v1.swap(v2)</TT>? 
Informally, three possibilities:</P>
<P>1. This operation is illegal. Perhaps we could say that an implementation is 
required to check and to throw an exception, or perhaps we could say it's 
undefined behavior.</P>
<P>2. The operation performs a slow swap (i.e. using three invocations of 
<TT>operator=</TT>, leaving each allocator with its original container. This 
would be an O(N) operation.</P>
<P>3. The operation swaps both the vectors' contents and their allocators. This 
would be an O(1) operation. That is:</P>
<BLOCKQUOTE><PRE>    my_alloc a1(...);
    my_alloc a2(...);
    assert(a1 != a2);

    vector&lt;int, my_alloc&gt; v1(a1);
    vector&lt;int, my_alloc&gt; v2(a2);
    assert(a1 == v1.get_allocator());
    assert(a2 == v2.get_allocator());

    v1.swap(v2);
    assert(a1 == v2.get_allocator());
    assert(a2 == v1.get_allocator());
  </PRE></BLOCKQUOTE>
<P><B>Proposed resolution:</B></P>
<P><I>[Kona: This is part of a general problem. We need a paper saying how to 
deal with unequal allocators in general.]</I></P>
<P><I>[pre-Sydney: Howard argues for option 3 in n1599.]</I></P>
<HR>
<A name=432>
<H3>432.&nbsp;stringbuf::overflow() makes only one write position 
available</H3></A>
<P><B>Section:</B>&nbsp;27.7.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.stringbuf.virtuals">[lib.stringbuf.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Christian W Brock&nbsp; <B>Date:</B>&nbsp;24 Sep 2003</P>
<P>27.7.1.3 par 8 says:</P>
<BLOCKQUOTE>Notes: The function can make a write position available only if ( 
  mode &amp; ios_base::out) != 0. To make a write position available, the 
  function reallocates (or initially allocates) an array object with a 
  sufficient number of elements to hold the current array object (if any), plus 
  one additional write position. If ( mode &amp; ios_base::in) != 0, the 
  function alters the read end pointer egptr() to point just past the new write 
  position (as does the write end pointer epptr()). </BLOCKQUOTE>
<P>The sentences "plus one additional write position." and especially "(as does 
the write end pointer epptr())" COULD by interpreted (and is interpreted by at 
least my library vendor) as: </P>
<BLOCKQUOTE>post-condition: epptr() == pptr()+1 </BLOCKQUOTE>
<P>This WOULD force sputc() to call the virtual overflow() each time. </P>
<P>The proposed change also affects Defect Report 169.</P>
<P><B>Proposed resolution:</B></P>
<P>27.7.1.1/2 Change:</P>
<BLOCKQUOTE>2- Notes: The function allocates no array object. </BLOCKQUOTE>
<P>to: </P>
<BLOCKQUOTE>2- Postcondition: str() == "". </BLOCKQUOTE>
<P>27.7.1.1/3 Change: </P>
<BLOCKQUOTE>
  <P>-3- Effects: Constructs an object of class basic_stringbuf, initializing 
  the base class with basic_streambuf() (lib.streambuf.cons), and initializing 
  mode with which . Then copies the content of str into the basic_stringbuf 
  underlying character sequence and initializes the input and output sequences 
  according to which. If which &amp; ios_base::out is true, initializes the 
  output sequence with the underlying sequence. If which &amp; ios_base::in is 
  true, initializes the input sequence with the underlying sequence. 
</P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>-3- Effects: Constructs an object of class basic_stringbuf, initializing 
  the base class with basic_streambuf() (lib.streambuf.cons), and initializing 
  mode with which. Then copies the content of str into the basic_stringbuf 
  underlying character sequence. If which &amp; ios_base::out is true, 
  initializes the output sequence such that pbase() points to the first 
  underlying character, epptr() points one past the last underlying character, 
  and if (which &amp; ios_base::ate) is true, pptr() is set equal to epptr() 
  else pptr() is set equal to pbase(). If which &amp; ios_base::in is true, 
  initializes the input sequence such that eback() and gptr() point to the first 
  underlying character and egptr() points one past the last underlying 
  character. </P></BLOCKQUOTE>
<P>27.7.1.2/1 Change:</P>
<BLOCKQUOTE>
  <P>-1- Returns: A basic_string object whose content is equal to the 
  basic_stringbuf underlying character sequence. If the buffer is only created 
  in input mode, the underlying character sequence is equal to the input 
  sequence; otherwise, it is equal to the output sequence. In case of an empty 
  underlying character sequence, the function returns 
  basic_string&lt;charT,traits,Allocator&gt;(). </P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>-1- Returns: A basic_string object whose content is equal to the 
  basic_stringbuf underlying character sequence. If the basic_stringbuf was 
  created only in input mode, the resultant basic_string contains the character 
  sequence in the range [eback(), egptr()). If the basic_stringbuf was created 
  with (which &amp; ios_base::out) being true then the resultant basic_string 
  contains the character sequence in the range [pbase(), high_mark) where 
  high_mark represents the position one past the highest initialized character 
  in the buffer. Characters can be initialized either through writing to the 
  stream, or by constructing the basic_stringbuf with a basic_string, or by 
  calling the str(basic_string) member function. In the case of calling the 
  str(basic_string) member function, all characters initialized prior to the 
  call are now considered uninitialized (except for those characters 
  re-initialized by the new basic_string). Otherwise the basic_stringbuf has 
  been created in neither input nor output mode and a zero length basic_string 
  is returned. </P></BLOCKQUOTE>
<P>27.7.1.2/2 Change: </P>
<BLOCKQUOTE>
  <P>-2- Effects: If the basic_stringbuf's underlying character sequence is not 
  empty, deallocates it. Then copies the content of s into the basic_stringbuf 
  underlying character sequence and initializes the input and output sequences 
  according to the mode stored when creating the basic_stringbuf object. If 
  (mode&amp;ios_base::out) is true, then initializes the output sequence with 
  the underlying sequence. If (mode&amp;ios_base::in) is true, then initializes 
  the input sequence with the underlying sequence. </P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>-2- Effects: Copies the content of s into the basic_stringbuf underlying 
  character sequence. If mode &amp; ios_base::out is true, initializes the 
  output sequence such that pbase() points to the first underlying character, 
  epptr() points one past the last underlying character, and if (mode &amp; 
  ios_base::ate) is true, pptr() is set equal to epptr() else pptr() is set 
  equal to pbase(). If mode &amp; ios_base::in is true, initializes the input 
  sequence such that eback() and gptr() point to the first underlying character 
  and egptr() points one past the last underlying character. </P></BLOCKQUOTE>
<P>Remove 27.2.1.2/3. (Same rationale as issue 238: incorrect and 
unnecessary.)</P>
<P>27.7.1.3/1 Change:</P>
<BLOCKQUOTE>
  <P>1- Returns: If the input sequence has a read position available, returns 
  traits::to_int_type(*gptr()). Otherwise, returns traits::eof(). 
</P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>1- Returns: If the input sequence has a read position available, returns 
  traits::to_int_type(*gptr()). Otherwise, returns traits::eof(). Any character 
  in the underlying buffer which has been initialized is considered to be part 
  of the input sequence. </P></BLOCKQUOTE>
<P>27.7.1.3/9 Change:</P>
<BLOCKQUOTE>
  <P>-9- Notes: The function can make a write position available only if ( mode 
  &amp; ios_base::out) != 0. To make a write position available, the function 
  reallocates (or initially allocates) an array object with a sufficient number 
  of elements to hold the current array object (if any), plus one additional 
  write position. If ( mode &amp; ios_base::in) != 0, the function alters the 
  read end pointer egptr() to point just past the new write position (as does 
  the write end pointer epptr()). </P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>-9- The function can make a write position available only if ( mode &amp; 
  ios_base::out) != 0. To make a write position available, the function 
  reallocates (or initially allocates) an array object with a sufficient number 
  of elements to hold the current array object (if any), plus one additional 
  write position. If ( mode &amp; ios_base::in) != 0, the function alters the 
  read end pointer egptr() to point just past the new write position. 
</P></BLOCKQUOTE>
<P>27.7.1.3/12 Change:</P>
<BLOCKQUOTE>
  <P>-12- _ If (newoff + off) &lt; 0, or (xend - xbeg) &lt; (newoff + off), the 
  positioning operation fails. Otherwise, the function assigns xbeg + newoff + 
  off to the next pointer xnext . </P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>
  <P>-12- _ If (newoff + off) &lt; 0, or if (newoff + off) refers to an 
  uninitialized character (as defined in 27.7.1.2 <A 
  href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.stringbuf.members">[lib.stringbuf.members]</A> 
  paragraph 1), the positioning operation fails. Otherwise, the function assigns 
  xbeg + newoff + off to the next pointer xnext . </P></BLOCKQUOTE>
<P><I>[post-Kona: Howard provided wording. At Kona the LWG agreed that something 
along these lines was a good idea, but the original proposed resolution didn't 
say enough about the effect of various member functions on the underlying 
character sequences.]</I></P>
<P><B>Rationale:</B></P>
<P>The current basic_stringbuf description is over-constrained in such a way as 
to prohibit vendors from making this the high-performance in-memory stream it 
was meant to be. The fundamental problem is that the pointers: eback(), gptr(), 
egptr(), pbase(), pptr(), epptr() are observable from a derived client, and the 
current description restricts the range [pbase(), epptr()) from being grown 
geometrically. This change allows, but does not require, geometric growth of 
this range.</P>
<P>Backwards compatibility issues: These changes will break code that derives 
from basic_stringbuf, observes epptr(), and depends upon [pbase(), epptr()) 
growing by one character on each call to overflow() (i.e. test suites). 
Otherwise there are no backwards compatibility issues.</P>
<P>27.7.1.1/2: The non-normative note is non-binding, and if it were binding, 
would be over specification. The recommended change focuses on the important 
observable fact.</P>
<P>27.7.1.1/3: This change does two things: 1. It describes exactly what must 
happen in terms of the sequences. The terms "input sequence" and "output 
sequence" are not well defined. 2. It introduces a common extension: open with 
app or ate mode. I concur with issue 238 that paragraph 4 is both wrong and 
unnecessary.</P>
<P>27.7.1.2/1: This change is the crux of the efficiency issue. The resultant 
basic_string is not dependent upon epptr(), and thus implementors are free to 
grow the underlying buffer geometrically during overflow() *and* place epptr() 
at the end of that buffer.</P>
<P>27.7.1.2/2: Made consistent with the proposed 27.7.1.1/3.</P>
<P>27.7.1.3/1: Clarifies that characters written to the stream beyond the 
initially specified string are available for reading in an i/o 
basic_streambuf.</P>
<P>27.7.1.3/9: Made normative by removing "Notes:", and removed the trailing 
parenthetical comment concerning epptr().</P>
<P>27.7.1.3/12: Restricting the positioning to [xbeg, xend) is no longer 
allowable since [pbase(), epptr()) may now contain uninitialized characters. 
Positioning is only allowable over the initialized range.</P>
<HR>
<A name=434>
<H3>434.&nbsp;bitset::to_string() hard to use</H3></A>
<P><B>Section:</B>&nbsp;23.3.5.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.members">[lib.bitset.members]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;15 Oct 2003</P>
<P>It has been pointed out a number of times that the bitset to_string() member 
function template is tedious to use since callers must explicitly specify the 
entire template argument list (3 arguments). At least two implementations 
provide a number of overloads of this template to make it easier to use. </P>
<P><B>Proposed resolution:</B></P>
<P>In order to allow callers to specify no template arguments at all, just the 
first one (charT), or the first 2 (charT and traits), in addition to all three 
template arguments, add the following three overloads to both the interface 
(declarations only) of the class template bitset as well as to section 23.3.5.2, 
immediately after p34, the Returns clause of the existing to_string() member 
function template:</P><PRE>    template &lt;class charT, class traits&gt;
    basic_string&lt;charT, traits, allocator&lt;charT&gt; &gt;
    to_string () const;

    -34.1- Returns: to_string&lt;charT, traits, allocator&lt;charT&gt; &gt;().

    template &lt;class charT&gt;
    basic_string&lt;charT, char_traits&lt;charT&gt;, allocator&lt;charT&gt; &gt;
    to_string () const;

    -34.2- Returns: to_string&lt;charT, char_traits&lt;charT&gt;, allocator&lt;charT&gt; &gt;().

    basic_string&lt;char, char_traits&lt;char&gt;, allocator&lt;char&gt; &gt;
    to_string () const;

    -34.3- Returns: to_string&lt;char, char_traits&lt;char&gt;, allocator&lt;char&gt; &gt;().
</PRE>
<P><I>[Kona: the LWG agrees that this is an improvement over the status quo. 
Dietmar thought about an alternative using a proxy object but now believes that 
the proposed resolution above is the right choice. ]</I></P>
<HR>
<A name=435>
<H3>435.&nbsp;bug in DR 25</H3></A>
<P><B>Section:</B>&nbsp;21.3.7.9 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-strings.html#lib.string.io">[lib.string.io]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;15 Oct 2003</P>
<P>It has been pointed out that the proposed resolution in DR 25 may not be 
quite up to snuff: <BR>http://gcc.gnu.org/ml/libstdc++/2003-09/msg00147.html 
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#25<BR></P>
<P>It looks like Petur is right. The complete corrected text is copied below. I 
think we may have have been confused by the reference to 22.2.2.2.2 and the 
subsequent description of `n' which actually talks about the second argument to 
sputn(), not about the number of fill characters to pad with. </P>
<P>So the question is: was the original text correct? If the intent was to 
follow classic iostreams then it most likely wasn't, since setting width() to 
less than the length of the string doesn't truncate it on output. This is also 
the behavior of most implementations (except for SGI's standard iostreams where 
the operator does truncate). </P>
<P><B>Proposed resolution:</B></P>
<P>Change the text in 21.3.7.9, p4 from</P>
<BLOCKQUOTE>If bool(k) is true, inserts characters as if by calling 
  os.rdbuf()-&gt;sputn(str.data(), n), padding as described in stage 3 of 
  lib.facet.num.put.virtuals, where n is the larger of os.width() and 
  str.size(); </BLOCKQUOTE>
<P>to</P>
<BLOCKQUOTE>If bool(k) is true, determines padding as described in 
  lib.facet.num.put.virtuals, and then inserts the resulting sequence of 
  characters <TT>seq</TT> as if by calling <TT>os.rdbuf()-&gt;sputn(seq, 
  n)</TT>, where <TT>n</TT> is the larger of <TT>os.width()</TT> and 
  <TT>str.size()</TT>; </BLOCKQUOTE>
<P><I>[Kona: it appears that neither the original wording, DR25, nor the 
proposed resolution, is quite what we want. We want to say that the string will 
be output, padded to os.width() if necessary. We don't want to duplicate the 
padding rules in clause 22, because they're complicated, but we need to be 
careful because they weren't quite written with quite this case in mind. We need 
to say what the character sequence is, and then defer to clause 22. Post-Kona: 
Benjamin provided wording.]</I></P>
<HR>
<A name=438>
<H3>438.&nbsp;Ambiguity in the "do the right thing" clause</H3></A>
<P><B>Section:</B>&nbsp;23.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.sequence.reqmts">[lib.sequence.reqmts]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Howard Hinnant&nbsp; <B>Date:</B>&nbsp;20 Oct 2003</P>
<P>Section 23.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.sequence.reqmts">[lib.sequence.reqmts]</A>, 
paragraphs 9-11, fixed up the problem noticed with statements like:</P><PRE>vector&lt;int&gt; v(10, 1);
</PRE>
<P>The intent of the above statement was to construct with:</P><PRE>vector(size_type, const value_type&amp;);
</PRE>
<P>but early implementations failed to compile as they bound to:</P><PRE>template &lt;class InputIterator&gt;
vector(InputIterator f, InputIterator l);
</PRE>
<P>instead.</P>
<P>Paragraphs 9-11 say that if InputIterator is an integral type, then the 
member template constructor will have the same effect as:</P><PRE>vector&lt;static_cast&lt;size_type&gt;(f), static_cast&lt;value_type&gt;(l));
</PRE>
<P>(and similarly for the other member template functions of sequences).</P>
<P>There is also a note that describes one implementation technique:</P>
<BLOCKQUOTE>One way that sequence implementors can satisfy this requirement is 
  to specialize the member template for every integral type. </BLOCKQUOTE>
<P>This might look something like:</P>
<BLOCKQUOTE><PRE>template &lt;class T&gt;
struct vector
{
     typedef unsigned size_type;

     explicit vector(size_type) {}
     vector(size_type, const T&amp;) {}

     template &lt;class I&gt;
     vector(I, I);

     // ...
};

template &lt;class T&gt;
template &lt;class I&gt;
vector&lt;T&gt;::vector(I, I) { ... }

template &lt;&gt;
template &lt;&gt;
vector&lt;int&gt;::vector(int, int) { ... }

template &lt;&gt;
template &lt;&gt;
vector&lt;int&gt;::vector(unsigned, unsigned) { ... }

//  ...
</PRE></BLOCKQUOTE>
<P>Label this solution 'A'.</P>
<P>The standard also says:</P>
<BLOCKQUOTE>Less cumbersome implementation techniques also exist. </BLOCKQUOTE>
<P>A popular technique is to not specialize as above, but instead catch every 
call with the member template, detect the type of InputIterator, and then 
redirect to the correct logic. Something like: </P>
<BLOCKQUOTE><PRE>template &lt;class T&gt;
template &lt;class I&gt;
vector&lt;T&gt;::vector(I f, I l)
{
     choose_init(f, l, int2type&lt;is_integral&lt;I&gt;::value&gt;());
}

template &lt;class T&gt;
template &lt;class I&gt;
vector&lt;T&gt;::choose_init(I f, I l, int2type&lt;false&gt;)
{
    // construct with iterators
}

template &lt;class T&gt;
template &lt;class I&gt;
vector&lt;T&gt;::choose_init(I f, I l, int2type&lt;true&gt;)
{
    size_type sz = static_cast&lt;size_type&gt;(f);
    value_type v = static_cast&lt;value_type&gt;(l);
    // construct with sz,v
}
</PRE></BLOCKQUOTE>
<P>Label this solution 'B'.</P>
<P>Both of these solutions solve the case the standard specifically 
mentions:</P><PRE>vector&lt;int&gt; v(10, 1);  // ok, vector size 10, initialized to 1
</PRE>
<P>However, (and here is the problem), the two solutions have different behavior 
in some cases where the value_type of the sequence is not an integral type. For 
example consider: </P>
<BLOCKQUOTE><PRE>     pair&lt;char, char&gt;                     p('a', 'b');
     vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt;   d('a', 'b');
</PRE></BLOCKQUOTE>
<P>The second line of this snippet is likely an error. Solution A catches the 
error and refuses to compile. The reason is that there is no specialization of 
the member template constructor that looks like: </P><PRE>template &lt;&gt;
template &lt;&gt;
vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt;::vector(char, char) { ... }
</PRE>
<P>So the expression binds to the unspecialized member template constructor, and 
then fails (compile time) because char is not an InputIterator. </P>
<P>Solution B compiles the above example though. 'a' is casted to an unsigned 
integral type and used to size the outer vector. 'b' is static casted to the 
inner vector using it's explicit constructor: </P><PRE>explicit vector(size_type n);
</PRE>
<P>and so you end up with a static_cast&lt;size_type&gt;('a') by 
static_cast&lt;size_type&gt;('b') matrix. </P>
<P>It is certainly possible that this is what the coder intended. But the 
explicit qualifier on the inner vector has been thwarted at any rate. </P>
<P>The standard is not clear whether the expression: </P><PRE>     vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt;   d('a', 'b');
</PRE>
<P>(and similar expressions) are: </P>
<OL>
  <LI>undefined behavior. 
  <LI>illegal and must be rejected. 
  <LI>legal and must be accepted. </LI></OL>
<P>My preference is listed in the order presented.</P>
<P>There are still other techniques for implementing the requirements of 
paragraphs 9-11, namely the "restricted template technique" (e.g. enable_if). 
This technique is the most compact and easy way of coding the requirements, and 
has the behavior of #2 (rejects the above expression). </P>
<P>Choosing 1 would allow all implementation techniques I'm aware of. Choosing 2 
would allow only solution 'A' and the enable_if technique. Choosing 3 would 
allow only solution 'B'. </P>
<P>Possible wording for a future standard if we wanted to actively reject the 
expression above would be to change "static_cast" in paragraphs 9-11 to 
"implicit_cast" where that is defined by: </P>
<BLOCKQUOTE><PRE>template &lt;class T, class U&gt;
inline
T implicit_cast(const U&amp; u)
{
     return u;
}
</PRE></BLOCKQUOTE>
<P><B>Proposed resolution:</B></P>Replace 23.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.sequence.reqmts">[lib.sequence.reqmts]</A> 
paragraphs 9 - 11 with: 
<P>For every sequence defined in this clause and in clause lib.strings:</P>
<UL>
  <LI>
  <P>If the constructor</P><PRE>       template &lt;class InputIterator&gt;
       X(InputIterator f, InputIterator l,
         const allocator_type&amp; a = allocator_type())
       </PRE>
  <P>is called with a type InputIterator that does not qualify as an input 
  iterator, then the constructor will behave as if the overloaded 
  constructor:</P><PRE>       X(size_type, const value_type&amp; = value_type(),
         const allocator_type&amp; = allocator_type())
       </PRE>
  <P>were called instead, with the arguments f, l and a, respectively.</P>
  <LI>
  <P>If the member functions of the forms:</P><PRE>       template &lt;class InputIterator&gt;          //  such as  insert()
       rt fx1(iterator p, InputIterator f, InputIterator l);

       template &lt;class InputIterator&gt;          //  such as  append(), assign()
       rt fx2(InputIterator f, InputIterator l);

       template &lt;class InputIterator&gt;          //  such as  replace()
       rt fx3(iterator i1, iterator i2, InputIterator f, InputIterator l);
       </PRE>
  <P>are called with a type InputIterator that does not qualify as an input 
  iterator, then these functions will behave as if the overloaded member 
  functions:</P><PRE>       rt fx1(iterator, size_type, const value_type&amp;);

       rt fx2(size_type, const value_type&amp;);

       rt fx3(iterator, iterator, size_type, const value_type&amp;);
       </PRE>
  <P>were called instead, with the same arguments.</P></LI></UL>
<P>In the previous paragraph the alternative binding will fail if f is not 
implicitly convertible to X::size_type or if l is not implicitly convertible to 
X::value_type.</P>
<P>The extent to which an implementation determines that a type cannot be an 
input iterator is unspecified, except that as a minimum integral types shall not 
qualify as input iterators. </P>
<P><I>[ Kona: agreed that the current standard requires <TT>v('a', 'b')</TT> to 
be accepted, and also agreed that this is surprising behavior. The LWG 
considered several options, including something like implicit_cast, which 
doesn't appear to be quite what we want. We considered Howards three options: 
allow acceptance or rejection, require rejection as a compile time error, and 
require acceptance. By straw poll (1-6-1), we chose to require a compile time 
error. Post-Kona: Howard provided wording. ]</I></P>
<P><I>[ Sydney: The LWG agreed with this general direction, but there was some 
discomfort with the wording in the original proposed resolution. Howard 
submitted new wording, and we will review this again in Redmond. ]</I></P>
<P><B>Rationale:</B></P>
<P>The proposed resolution fixes:</P><PRE>  vector&lt;int&gt; v(10, 1);
</PRE>
<P>since as integral types 10 and 1 must be disqualified as input iterators and 
therefore the (size,value) constructor is called (as if).</P>
<P>The proposed resolution breaks:</P><PRE>  vector&lt;vector&lt;T&gt; &gt; v(10, 1);
</PRE>
<P>because the integral type 1 is not *implicitly* convertible to 
vector&lt;T&gt;. The wording above requires a diagnostic.</P>
<P>The proposed resolution leaves the behavior of the following code 
unspecified. </P><PRE>  struct A
  {
    operator int () const {return 10;}
  };

  struct B
  {
    B(A) {}
  };

  vector&lt;B&gt; v(A(), A());
</PRE>
<P>The implementation may or may not detect that A is not an input iterator and 
employee the (size,value) constructor. Note though that in the above example if 
the B(A) constructor is qualified explicit, then the implementation must reject 
the constructor as A is no longer implicitly convertible to B. </P>
<HR>
<A name=441>
<H3>441.&nbsp;Is fpos::state const?</H3></A>
<P><B>Section:</B>&nbsp;27.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fpos">[lib.fpos]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Vincent Leloup&nbsp; <B>Date:</B>&nbsp;17 Nov 2003</P>
<P>In section 27.4.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fpos.members">[lib.fpos.members]</A> 
fpos&lt;stateT&gt;::state() is declared non const, but in section 27.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fpos">[lib.fpos]</A> 
it is declared const. </P>
<P><B>Proposed resolution:</B></P>
<P>In section 27.4.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fpos.members">[lib.fpos.members]</A>, 
change the declaration of <TT>fpos&lt;stateT&gt;::state()</TT> to const. </P>
<HR>
<A name=442>
<H3>442.&nbsp;sentry::operator bool() inconsistent signature</H3></A>
<P><B>Section:</B>&nbsp;27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Vincent Leloup&nbsp; <B>Date:</B>&nbsp;18 Nov 2003</P>
<P>In section 27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A> 
paragraph 4, in description part basic_ostream&lt;charT, 
traits&gt;::sentry::operator bool() is declared as non const, but in section 
27.6.2.3, in synopsis it is declared const. </P>
<P><B>Proposed resolution:</B></P>
<P>In section 27.6.2.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream::sentry">[lib.ostream::sentry]</A> 
paragraph 4, change the declaration of <TT>sentry::operator bool()</TT> to 
const. </P>
<HR>
<A name=443>
<H3>443.&nbsp;filebuf::close() inconsistent use of EOF</H3></A>
<P><B>Section:</B>&nbsp;27.8.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.filebuf.members">[lib.filebuf.members]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Vincent Leloup&nbsp; <B>Date:</B>&nbsp;20 Nov 2003</P>
<P>In section 27.8.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.filebuf.members">[lib.filebuf.members]</A> 
par6, in effects description of basic_filebuf&lt;charT, traits&gt;::close(), 
overflow(EOF) is used twice; should be overflow(traits::eof()). </P>
<P><B>Proposed resolution:</B></P>
<P>Change overflow(EOF) to overflow(traits::eof()). </P>
<HR>
<A name=444>
<H3>444.&nbsp;Bad use of casts in fstream</H3></A>
<P><B>Section:</B>&nbsp;27.8.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fstreams">[lib.fstreams]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Vincent Leloup&nbsp; <B>Date:</B>&nbsp;20 Nov 2003</P>
<P>27.8.1.7 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ifstream.members">[lib.ifstream.members]</A> 
p1, 27.8.1.10 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ofstream.members">[lib.ofstream.members]</A> 
p1, 27.8.1.13 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fstream.members">[lib.fstream.members]</A> 
p1 seems have same problem as exposed in LWG issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#252">252</A>. 
</P>
<P><B>Proposed resolution:</B></P>
<P><I>[Sydney: Genuine defect. 27.8.1.13 needs a cast to cast away constness. 
The other two places are stylistic: we could change the C-style casts to 
const_cast. Post-Sydney: Howard provided wording. ]</I></P>
<P>Change 27.8.1.7/1 from:</P>
<BLOCKQUOTE>Returns: (basic_filebuf&lt;charT,traits&gt;*)&amp;sb. </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Returns: 
  const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb). </BLOCKQUOTE>
<P>Change 27.8.1.10/1 from:</P>
<BLOCKQUOTE>Returns: (basic_filebuf&lt;charT,traits&gt;*)&amp;sb. </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Returns: 
  const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb). </BLOCKQUOTE>
<P>Change 27.8.1.13/1 from:</P>
<BLOCKQUOTE>Returns: &amp;sb. </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>Returns: 
  const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb). </BLOCKQUOTE>
<HR>
<A name=445>
<H3>445.&nbsp;iterator_traits::reference unspecified for some iterator 
categories</H3></A>
<P><B>Section:</B>&nbsp;24.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.iterator.traits">[lib.iterator.traits]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;9 Dec 2003</P>
<P>The standard places no restrictions at all on the reference type of input, 
output, or forward iterators (for forward iterators it only specifies that *x 
must be value_type&amp; and doesn't mention the reference type). Bidirectional 
iterators' reference type is restricted only by implication, since the base 
iterator's reference type is used as the return type of reverse_iterator's 
operator*, which must be T&amp; in order to be a conforming forward iterator. 
</P>
<P>Here's what I think we ought to be able to expect from an input or forward 
iterator's reference type R, where a is an iterator and V is its value_type </P>
<UL>
  <LI>*a is convertible to R 
  <LI>R is convertible to V 
  <LI>static_cast&lt;V&gt;(static_cast&lt;R&gt;(*a)) is equivalent to 
  static_cast&lt;V&gt;(*a) </LI></UL>
<P>A mutable forward iterator ought to satisfy, for x of type V:</P>
<LI>{ R r = *a; r = x; } is equivalent to *a = x; 
<P>I think these requirements capture existing container iterators (including 
vector&lt;bool&gt;'s), but render istream_iterator invalid; its reference type 
would have to be changed to a constant reference. </P>
<P>(Jeremy Siek) During the discussion in Sydney, it was felt that a simpler 
long term solution for this was needed. The solution proposed was to require 
<TT>reference</TT> to be the same type as <TT>*a</TT> and <TT>pointer</TT> to be 
the same type as <TT>a-&gt;</TT>. Most iterators in the Standard Library already 
meet this requirement. Some iterators are output iterators, and do not need to 
meet the requirement, and others are only specified through the general iterator 
requirements (which will change with this resolution). The sole case where there 
is an explicit definition of the reference type that will need to change is 
<TT>istreambuf_iterator</TT> which returns <TT>charT</TT> from 
<TT>operator*</TT> but has a reference type of <TT>charT&amp;</TT>. We propose 
changing the reference type of <TT>istreambuf_iterator</TT> to <TT>charT</TT>. 
</P>
<P>The other option for resolving the issue with <TT>pointer</TT>, mentioned in 
the note below, is to remove <TT>pointer</TT> altogether. I prefer placing 
requirements on <TT>pointer</TT> to removing it for two reasons. First, 
<TT>pointer</TT> will become useful for implementing iterator adaptors and in 
particular, <TT>reverse_iterator</TT> will become more well defined. Second, 
removing <TT>pointer</TT> is a rather drastic and publicly-visible action to 
take.</P>
<P>The proposed resolution technically enlarges the requirements for iterators, 
which means there are existing iterators (such as <TT>istreambuf_iterator</TT>, 
and potentially some programmer-defined iterators) that will no longer meet the 
requirements. Will this break existing code? The scenario in which it would is 
if an algorithm implementation (say in the Standard Library) is changed to rely 
on <TT>iterator_traits::reference</TT>, and then is used with one of the 
iterators that do not have an appropriately defined 
<TT>iterator_traits::reference</TT>. </P>
<P>The proposed resolution makes one other subtle change. Previously, it was 
required that output iterators have a <TT>difference_type</TT> and 
<TT>value_type</TT> of <TT>void</TT>, which means that a forward iterator could 
not be an output iterator. This is clearly a mistake, so I've changed the 
wording to say that those types may be <TT>void</TT>. </P>
<P><B>Proposed resolution:</B></P>
<P>In <FONT color=red>24.3.1.1</FONT>, after:</P>
<BLOCKQUOTE>be defined as the iterator's difference type, value type and 
  iterator category, respectively. </BLOCKQUOTE>
<P>In <FONT color=red>24.3.1.1</FONT>, add:</P>
<BLOCKQUOTE>In addition, the types <PRE>iterator_traits&lt;Iterator&gt;::reference
iterator_traits&lt;Iterator&gt;::pointer
</PRE>must be defined as the iterator's reference and pointer types, that is, 
  the same type as the type of <TT>*a</TT> and <TT>a-&gt;</TT>, respectively. 
</BLOCKQUOTE>
<P>In <FONT color=red>24.3.1.1</FONT>, change:</P>
<BLOCKQUOTE>In the case of an output iterator, the types <PRE>iterator_traits&lt;Iterator&gt;::difference_type
iterator_traits&lt;Iterator&gt;::value_type
</PRE>are both defined as <TT>void</TT>. </BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>In the case of an output iterator, the types <PRE>iterator_traits&lt;Iterator&gt;::difference_type
iterator_traits&lt;Iterator&gt;::value_type
iterator_traits&lt;Iterator&gt;::reference
iterator_traits&lt;Iterator&gt;::pointer
</PRE>may be defined as <TT>void</TT>. </BLOCKQUOTE>
<P>In <FONT color=red>24.5.6</FONT>, change:</P>
<BLOCKQUOTE><PRE>typename traits::off_type, charT*, charT&amp;&gt;
</PRE></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE><PRE>typename traits::off_type, charT*, charT&gt;
</PRE></BLOCKQUOTE>
<P><I>[ Sydney: Agreed that this is under-specified, but it's not the only place 
where iterators are under-specified. We may need a more complete review. One 
nice simple rule that would solve this problem: *a is always <TT>reference</TT> 
by definition, and a-&gt; is always <TT>pointer</TT> by definition. If we do 
that, then we'll also have to change a few existing iterators (e.g. 
istreambuf_iterator) so they conform to that rule. We need a review of how 
extensive those changes would be. Or instead of fixing <TT>pointer</TT> we could 
remove it. (Which would require changing reverse_iterator as part of that 
change, since the present reverse_iterator relies on the existence of 
<TT>pointer</TT>.) Jeremy will supply a more detailed analysis for Redmond. 
]</I></P>
<HR>
<A name=446>
<H3>446.&nbsp;Iterator equality between different containers</H3></A>
<P><B>Section:</B>&nbsp;24.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.iterator.requirements">[lib.iterator.requirements]</A>, 
23.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.container.requirements">[lib.container.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andy Koenig&nbsp; <B>Date:</B>&nbsp;16 Dec 2003</P>
<P>What requirements does the standard place on equality comparisons between 
iterators that refer to elements of different containers. For example, if v1 and 
v2 are empty vectors, is v1.end() == v2.end() allowed to yield true? Is it 
allowed to throw an exception? </P>
<P>The standard appears to be silent on both questions. </P>
<P><B>Proposed resolution:</B></P>
<P><I>[Sydney: The intention is that comparing two iterators from different 
containers is undefined, but it's not clear if we say that, or even whether it's 
something we should be saying in clause 23 or in clause 24. Intuitively we might 
want to say that equality is defined only if one iterator is reachable from 
another, but figuring out how to say it in any sensible way is a bit tricky: 
reachability is defined in terms of equality, so we can't also define equality 
in terms of reachability. ]</I></P>
<HR>
<A name=448>
<H3>448.&nbsp;Random Access Iterators over abstract classes</H3></A>
<P><B>Section:</B>&nbsp;24.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;7 Jan 2004</P>
<P>Table 76, the random access iterator requirement table, says that the return 
type of a[n] must be "convertible to T". When an iterator's value_type T is an 
abstract class, nothing is convertible to T. Surely this isn't an intended 
restriction? </P>
<P><B>Proposed resolution:</B></P>
<P>Change the return type to "convertible to T const&amp;". </P>
<HR>
<A name=449>
<H3>449.&nbsp;Library Issue 306 Goes Too Far</H3></A>
<P><B>Section:</B>&nbsp;18.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-support.html#lib.support.types">[lib.support.types]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Ready">Ready</A>&nbsp; 
<B>Submitter:</B>&nbsp;Pete Becker&nbsp; <B>Date:</B>&nbsp;15 Jan 2004</P>
<P>Original text:</P>
<BLOCKQUOTE>The macro offsetof accepts a restricted set of type arguments in 
  this International Standard. type 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." </BLOCKQUOTE>
<P>Revised text:</P>
<BLOCKQUOTE>"If type is not a POD structure or a POD union the results are 
  undefined." </BLOCKQUOTE>
<P>Looks to me like the revised text should have replaced only the second 
sentence. It doesn't make sense standing alone. </P>
<P><B>Proposed resolution:</B></P>
<P>Change 18.1, paragraph 5, to:</P>
<BLOCKQUOTE>The macro offsetof accepts a restricted set of type arguments in 
  this International Standard. If type is not a POD structure or a POD union the 
  results are undefined. The result of applying the offsetof macro to a field 
  that is a static data member or a function member is undefined." </BLOCKQUOTE>
<HR>
<A name=452>
<H3>452.&nbsp; locale::combine should be permitted to generate a named 
locale</H3></A>
<P><B>Section:</B>&nbsp;22.1.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.members">[lib.locale.members]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P><PRE>template&lt;class Facet&gt;
	locale::combine(const locale&amp;) const;
</PRE>
<P>is obliged to create a locale that has no name. This is overspecification and 
overkill. The resulting locale should follow the usual rules -- it has a name if 
the locale argument has a name and Facet is one of the standard facets. </P>
<P><I>[ Sydney and post-Sydney (see c++std-lib-13439, c++std-lib-13440, 
c++std-lib-13443): agreed that it's overkill to say that the locale is obligated 
to be nameless. However, we also can't require it to have a name. At the moment, 
locale names are based on categories and not on individual facets. If a locale 
contains two different facets of different names from the same category, then 
this would not fit into existing naming schemes. We need to give implementations 
more freedom. Bill will provide wording. ]</I></P>
<P><B>Proposed resolution:</B></P>
<P><I>[Bill now recommends that this be closed as NAD.]</I></P>
<P><B>Rationale:</B></P>
<HR>
<A name=453>
<H3>453.&nbsp;basic_stringbuf::seekoff need not always fail for an empty 
stream</H3></A>
<P><B>Section:</B>&nbsp;27.7.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.stringbuf.virtuals">[lib.stringbuf.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P><PRE>  pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir,
                                    ios_base::openmode);
</PRE>
<P>is obliged to fail if nothing has been inserted into the stream. This is 
unnecessary and undesirable. It should be permissible to seek to an effective 
offset of zero.</P>
<P><I>[ Sydney: Agreed that this is an annoying problem: seeking to zero should 
be legal. Bill will provide wording. ]</I></P>
<P><B>Proposed resolution:</B></P>
<P>Change the sentence from:</P>
<BLOCKQUOTE>For a sequence to be positioned, if its next pointer (either 
  gptr() or pptr()) is a null pointer, the positioning operation fails. 
</BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE>For a sequence to be positioned, if its next pointer (either 
  gptr() or pptr()) is a null pointer and the new offset newoff is nonzero, the 
  positioning operation fails. </BLOCKQUOTE>
<HR>
<A name=454>
<H3>454.&nbsp;basic_filebuf::open should accept wchar_t names</H3></A>
<P><B>Section:</B>&nbsp;27.8.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.filebuf.members">[lib.filebuf.members]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P><PRE>    basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);
</PRE>
<P>should be supplemented with the overload:</P><PRE>    basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);
</PRE>
<P>Depending on the operating system, one of these forms is fundamental and the 
other requires an implementation-defined mapping to determine the actual 
filename. </P>
<P><I>[Sydney: Yes, we want to allow wchar_t filenames. Bill will provide 
wording.]</I></P>
<P><B>Proposed resolution:</B></P>
<P>Change from:</P>
<BLOCKQUOTE><PRE>basic_filebuf&lt;charT,traits&gt;* open(
	const char* s,
	ios_base::openmode mode );
</PRE>
  <P>Effects: If is_open() != false, returns a null pointer. Otherwise, 
  initializes the filebuf as required. It then opens a file, if possible, whose 
  name is the NTBS s ("as if" by calling std::fopen(s,modstr)).</P></BLOCKQUOTE>
<P>to:</P>
<BLOCKQUOTE><PRE>basic_filebuf&lt;charT,traits&gt;* open(
	const char* s,
	ios_base::openmode mode );

basic_filebuf&lt;charT,traits&gt;* open(
	const wchar_t* ws,
	ios_base::openmode mode );
</PRE>
  <P>Effects: If is_open() != false, returns a null pointer. Otherwise, 
  initializes the filebuf as required. It then opens a file, if possible, whose 
  name is the NTBS s ("as if" by calling std::fopen(s,modstr)). For the second 
  signature, the NTBS s is determined from the WCBS ws in an 
  implementation-defined manner. </P>
  <P>(NOTE: For a system that "naturally" represents a filename as a WCBS, the 
  NTBS s in the first signature may instead be mapped to a WCBS; if so, it 
  follows the same mapping rules as the first argument to open.) 
u</P></BLOCKQUOTE>
<HR>
<A name=455>
<H3>455.&nbsp;cerr::tie() and wcerr::tie() are overspecified</H3></A>
<P><B>Section:</B>&nbsp;27.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostream.objects">[lib.iostream.objects]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P>
<P>Both cerr::tie() and wcerr::tie() are obliged to be null at program startup. 
This is overspecification and overkill. It is both traditional and useful to tie 
cerr to cout, to ensure that standard output is drained whenever an error 
message is written. This behavior should at least be permitted if not required. 
Same for wcerr::tie(). </P>
<P><B>Proposed resolution:</B></P>
<P>Add to the description of cerr:</P>
<BLOCKQUOTE>After the object cerr is initialized, cerr.tie() returns 
  &amp;cout. Its state is otherwise the same as required for 
  basic_ios&lt;char&gt;::init (lib.basic.ios.cons). </BLOCKQUOTE>
<P>Add to the description of wcerr:</P>
<BLOCKQUOTE>After the object wcerr is initialized, wcerr.tie() returns 
  &amp;wcout. Its state is otherwise the same as required for 
  basic_ios&lt;wchar_t&gt;::init (lib.basic.ios.cons). </BLOCKQUOTE>
<P><I>[Sydney: straw poll (3-1): we should <I>require</I>, not just permit, cout 
and cerr to be tied on startup. Pre-Redmond: Bill will provide wording.]</I></P>
<HR>
<A name=456>
<H3>456.&nbsp;Traditional C header files are overspecified</H3></A>
<P><B>Section:</B>&nbsp;17.4.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.headers">[lib.headers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P>
<P>The C++ Standard effectively requires that the traditional C headers (of the 
form &lt;xxx.h&gt;) be defined in terms of the newer C++ headers (of the form 
&lt;cxxx&gt;). Clauses 17.4.1.2/4 and D.5 combine to require that:</P>
<UL>
  <LI>Including the header &lt;cxxx&gt; declares a C name in namespace std. 
  <LI>Including the header &lt;xxx.h&gt; declares a C name in namespace std 
  (effectively by including &lt;cxxx&gt;), then imports it into the global 
  namespace with an individual using declaration. </LI></UL>
<P>The rules were left in this form despited repeated and heated objections from 
several compiler vendors. The C headers are often beyond the direct control of 
C++ implementors. In some organizations, it's all they can do to get a few 
#ifdef __cplusplus tests added. Third-party library vendors can perhaps wrap the 
C headers. But neither of these approaches supports the drastic restructuring 
required by the C++ Standard. As a result, it is still widespread practice to 
ignore this conformance requirement, nearly seven years after the committee last 
debated this topic. Instead, what is often implemented is: </P>
<UL>
  <LI>Including the header &lt;xxx.h&gt; declares a C name in the global 
  namespace. 
  <LI>Including the header &lt;cxxx&gt; declares a C name in the global 
  namespace (effectively by including &lt;xxx.h&gt;), then imports it into 
  namespace std with an individual using declaration. </LI></UL>
<P>The practical benefit for implementors with the second approach is that they 
can use existing C library headers, as they are pretty much obliged to do. The 
practical cost for programmers facing a mix of implementations is that they have 
to assume weaker rules:</P>
<UL>
  <LI>If you want to assuredly declare a C name in the global namespace, include 
  &lt;xxx.h&gt;. You may or may not also get the declaration in namespace std. 
  <LI>If you want to assuredly declare a C name in namespace std, include 
  &lt;cxxx.h&gt;. You may or may not also get the declaration in the global 
  namespace. </LI></UL>
<P>There also exists the <I>possibility</I> of subtle differences due to Koenig 
lookup, but there are so few non-builtin types defined in the C headers that 
I've yet to see an example of any real problems in this area. </P>
<P>It is worth observing that the rate at which programmers fall afoul of these 
differences has remained small, at least as measured by newsgroup postings and 
our own bug reports. (By an overwhelming margin, the commonest problem is still 
that programmers include &lt;string&gt; and can't understand why the typename 
string isn't defined -- this a decade after the committee invented namespace 
std, nominally for the benefit of all programmers.) </P>
<P>We should accept the fact that we made a serious mistake and rectify it, 
however belatedly, by explicitly allowing either of the two schemes for 
declaring C names in headers. </P>
<P><I>[Sydney: This issue has been debated many times, and will certainly have 
to be discussed in full committee before any action can be taken. However, the 
preliminary sentiment of the LWG was in favor of the change. (6 yes, 0 no, 2 
abstain) Robert Klarer suggests that we might also want to undeprecate the 
C-style <TT>.h</TT> headers.]</I></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=457>
<H3>457.&nbsp;bitset constructor: incorrect number of initialized bits</H3></A>
<P><B>Section:</B>&nbsp;23.3.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.cons">[lib.bitset.cons]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Review">Review</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dag Henriksson&nbsp; <B>Date:</B>&nbsp;30 Jan 2004</P>
<P>The constructor from unsigned long says it initializes "the first M bit 
positions to the corresponding bit values in val. M is the smaller of N and the 
value CHAR_BIT * sizeof(unsigned long)." </P>
<P>Object-representation vs. value-representation strikes again. CHAR_BIT * 
sizeof (unsigned long) does not give us the number of bits an unsigned long uses 
to hold the value. Thus, the first M bit position above is not guaranteed to 
have any corresponding bit values in val. </P>
<P><B>Proposed resolution:</B></P>
<P>In 23.3.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.bitset.cons">[lib.bitset.cons]</A> 
paragraph 2, change "M is the smaller of N and the value CHAR_BIT * sizeof 
(unsigned long). (249)" to "<TT>M</TT> is the smaller of <TT>N</TT> and the 
number of bits in the value representation (section 3.9 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/basic.html#basic.types">[basic.types]</A>) 
of <TT>unsigned long</TT>." </P>
<HR>
<A name=458>
<H3>458.&nbsp;24.1.5 contains unintented limitation for operator-</H3></A>
<P><B>Section:</B>&nbsp;24.1.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.random.access.iterators">[lib.random.access.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Daniel Frey&nbsp; <B>Date:</B>&nbsp;27 Feb 2004</P>
<P>In 24.1.5 [lib.random.access.iterators], table 76 the operational semantics 
for the expression "r -= n" are defined as "return r += -n". This means, that 
the expression -n must be valid, which is not the case for unsigned types. </P>
<P><I>[ Sydney: Possibly not a real problem, since difference type is required 
to be a signed integer type. However, the wording in the standard may be less 
clear than we would like. ]</I></P>
<P><B>Proposed resolution:</B></P>
<P>To remove this limitation, I suggest to change the operational semantics for 
this column to: </P><CODE>{ Distance m = n; if (m &gt;= 0) while (m--) --r; else 
while (m++) ++r; return r; } </CODE>
<HR>
<A name=459>
<H3>459.&nbsp;Requirement for widening in stage 2 is overspecification</H3></A>
<P><B>Section:</B>&nbsp;22.2.2.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.facet.num.get.virtuals">[lib.facet.num.get.virtuals]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#Open">Open</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;16 Mar 2004</P>
<P>When parsing strings of wide-character digits, the standard requires the 
library to widen narrow-character "atoms" and compare the widened atoms against 
the characters that are being parsed. Simply narrowing the wide characters would 
be far simpler, and probably more efficient. The two choices are equivalent 
except in convoluted test cases, and many implementations already ignore the 
standard and use narrow instead of widen.</P>
<P>First, I disagree that using narrow() instead of widen() would necessarily 
have unfortunate performance implications. A possible implementation of narrow() 
that allows num_get to be implemented in a much simpler and arguably comparably 
efficient way as calling widen() allows, i.e. without making a virtual call to 
do_narrow every time, is as follows: </P><PRE>  inline char ctype&lt;wchar_t&gt;::narrow (wchar_t wc, char dflt) const
  {
      const unsigned wi = unsigned (wc);

      if (wi &gt; UCHAR_MAX)
          return typeid (*this) == typeid (ctype&lt;wchar_t&gt;) ?
                 dflt : do_narrow (wc, dflt);

      if (narrow_ [wi] &lt; 0) {
         const char nc = do_narrow (wc, dflt);
         if (nc == dflt)
             return dflt;
         narrow_ [wi] = nc;
      }

      return char (narrow_ [wi]);
  }
</PRE>
<P>Second, I don't think the change proposed in the issue (i.e., to use narrow() 
instead of widen() during Stage 2) would be at all drastic. Existing 
implementations with the exception of libstdc++ currently already use narrow() 
so the impact of the change on programs would presumably be isolated to just a 
single implementation. Further, since narrow() is not required to translate 
alternate wide digit representations such as those mentioned in issue <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-defects.html#303">303</A> 
to their narrow equivalents (i.e., the portable source characters '0' through 
'9'), the change does not necessarily imply that these alternate digits would be 
treated as ordinary digits and accepted as part of numbers during parsing. In 
fact, the requirement in 22.2.1.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.ctype.virtuals">[lib.locale.ctype.virtuals]</A>, 
p13 forbids narrow() to translate an alternate digit character, wc, to an 
ordinary digit in the basic source character set unless the expression 
(ctype&lt;charT&gt;::is(ctype_base::digit, wc) == true) holds. This in turn is 
prohibited by the C standard (7.25.2.1.5, 7.25.2.1.5, and 5.2.1, respectively) 
for charT of either char or wchar_t. </P>
<P><I>[Sydney: To a large extent this is a nonproblem. As long as you're only 
trafficking in char and wchar_t we're only dealing with a stable character set, 
so you don't really need either 'widen' or 'narrow': can just use literals. 
Finally, it's not even clear whether widen-vs-narrow is the right question; 
arguably we should be using codecvt instead.]</I></P>
<P><B>Proposed resolution:</B></P>
<P>Change stage 2 so that implementations are permitted to use either technique 
to perform the comparison:</P>
<OL>
  <LI>call widen on the atoms and compare (either by using operator== or 
  char_traits&lt;charT&gt;::eq) the input with the widened atoms, or 
  <LI>call narrow on the input and compare the narrow input with the atoms 
  <LI>do (1) or (2) only if charT is not char or wchar_t, respectively; i.e., 
  avoid calling widen or narrow if it the source and destination types are the 
  same </LI></OL>
<HR>
<A name=460>
<H3>460.&nbsp;Default modes missing from basic_fstream member 
specifications</H3></A>
<P><B>Section:</B>&nbsp;27.8.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.fstreams">[lib.fstreams]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Ben Hutchings&nbsp; <B>Date:</B>&nbsp;1 Apr 2004</P>
<P>The second parameters of the non-default constructor and of the open member 
function for basic_fstream, named "mode", are optional according to the class 
declaration in 27.8.1.11 [lib.fstream]. The specifications of these members in 
27.8.1.12 [lib.fstream.cons] and 27.8.1.13 lib.fstream.members] disagree with 
this, though the constructor declaration has the "explicit" function-specifier 
implying that it is intended to be callable with one argument. </P>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=461>
<H3>461.&nbsp;time_get hard or impossible to implement</H3></A>
<P><B>Section:</B>&nbsp;22.2.5.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.time.get">[lib.locale.time.get]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;23 Mar 2004</P>
<P>Template time_get currently contains difficult, if not impossible, 
requirements for do_date_order, do_get_time, and do_get_date. All require the 
implementation to scan a field generated by the %x or %X conversion specifier in 
strftime. Yes, do_date_order can always return no_order, but that doesn't help 
the other functions. The problem is that %x can be nearly anything, and it can 
vary widely with locales. It's horribly onerous to have to parse "third sunday 
after Michaelmas in the year of our Lord two thousand and three," but that's 
what we currently ask of do_get_date. More practically, it leads some people to 
think that if %x produces 10.2.04, we should know to look for dots as 
separators. Still not easy. </P>
<P>Note that this is the <I>opposite</I> effect from the intent stated in the 
footnote earlier in this subclause: </P>
<BLOCKQUOTE>"In other words, user confirmation is required for reliable 
  parsing of user-entered dates and times, but machine-generated formats can be 
  parsed reliably. This allows parsers to be aggressive about interpreting user 
  variations on standard formats." </BLOCKQUOTE>
<P>We should give both implementers and users an easier and more reliable 
alternative: provide a (short) list of alternative delimiters and say what the 
default date order is for no_order. For backward compatibility, and maximum 
latitude, we can permit an implementation to parse whatever %x or %X generates, 
but we shouldn't require it. </P>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=462>
<H3>462.&nbsp;Destroying objects with static storage duration</H3></A>
<P><B>Section:</B>&nbsp;3.6.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/basic.html#basic.start.term">[basic.start.term]</A>, 
18.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-support.html#lib.support.start.term">[lib.support.start.term]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Bill Plauger&nbsp; <B>Date:</B>&nbsp;23 Mar 2004</P>
<P>3.6.3 Termination spells out in detail the interleaving of static destructor 
calls and calls to functions registered with atexit. To match this behavior 
requires intimate cooperation between the code that calls destructors and the 
exit/atexit machinery. The former is tied tightly to the compiler; the latter is 
a primitive mechanism inherited from C that traditionally has nothing to do with 
static construction and destruction. The benefits of intermixing destructor 
calls with atexit handler calls is questionable at best, and <I>very</I> 
difficult to get right, particularly when mixing third-party C++ libraries with 
different third-party C++ compilers and C libraries supplied by still other 
parties. </P>
<P>I believe the right thing to do is defer all static destruction until after 
all atexit handlers are called. This is a change in behavior, but one that is 
likely visible only to perverse test suites. At the very least, we should 
<I>permit</I> deferred destruction even if we don't require it. </P>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=463>
<H3>463.&nbsp;auto_ptr usability issues</H3></A>
<P><B>Section:</B>&nbsp;20.4.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.auto.ptr">[lib.auto.ptr]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Rani Sharoni&nbsp; <B>Date:</B>&nbsp;7 Dec 2003</P>
<P>TC1 CWG DR #84 effectively made the template&lt;class Y&gt; operator 
auto_ptr&lt;Y&gt;() member of auto_ptr (20.4.5.3/4) obsolete. </P>
<P>The sole purpose of this obsolete conversion member is to enable copy 
initialization base from r-value derived (or any convertible types like 
cv-types) case: </P><PRE>#include &lt;memory&gt;
using std::auto_ptr;

struct B {};
struct D : B {};

auto_ptr&lt;D&gt; source();
int sink(auto_ptr&lt;B&gt;);
int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
</PRE>
<P>The excellent analysis of conversion operations that was given in the final 
auto_ptr proposal 
(http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf) explicitly 
specifies this case analysis (case 4). DR #84 makes the analysis wrong and 
actually comes to forbid the loophole that was exploited by the auto_ptr 
designers. </P>
<P>I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that 
ever allowed this case. This is probably because it requires 3 user defined 
conversions and in fact current compilers conform to DR #84. </P>
<P>I was surprised to discover that the obsolete conversion member actually has 
negative impact of the copy initialization base from l-value derived case:</P><PRE>auto_ptr&lt;D&gt; dp;
int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
</PRE>
<P>I'm sure that the original intention was allowing this initialization using 
the template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt;&amp; a) constructor 
(20.4.5.1/4) but since in this copy initialization it's merely user defined 
conversion (UDC) and the obsolete conversion member is UDC with the same rank 
(for the early overloading stage) there is an ambiguity between them. </P>
<P>Removing the obsolete member will have impact on code that explicitly invokes 
it: </P><PRE>int y = sink(source().operator auto_ptr&lt;B&gt;());
</PRE>
<P>IMHO no one ever wrote such awkward code and the reasonable workaround for #1 
is: </P><PRE>int y = sink( auto_ptr&lt;B&gt;(source()) );
</PRE>
<P>I was even more surprised to find out that after removing the obsolete 
conversion member the initialization was still ill-formed: int x3 = sink(dp); // 
#3 EDG - no suitable copy constructor </P>
<P>This copy initialization semantically requires copy constructor which means 
that both template conversion constructor and the auto_ptr_ref conversion member 
(20.4.5.3/3) are required which is what was explicitly forbidden in DR #84. This 
is a bit amusing case in which removing ambiguity results with no candidates. 
</P>
<P>I also found exception safety issue with auto_ptr related to auto_ptr_ref: 
</P><PRE>int f(auto_ptr&lt;B&gt;, std::string);
auto_ptr&lt;B&gt; source2();

// string constructor throws while auto_ptr_ref
// "holds" the pointer
int x4 = f(source2(), "xyz"); // #4
</PRE>
<P>The theoretic execution sequence that will cause a leak: </P>
<OL>
  <LI>call auto_ptr&lt;B&gt;::operator auto_ptr_ref&lt;B&gt;() 
  <LI>call string::string(char const*) and throw </LI></OL>
<P>According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member 
returns auto_ptr_ref&lt;Y&gt; that holds *this and this is another defect since 
the type of *this is auto_ptr&lt;X&gt; where X might be different from Y. 
Several library vendors (e.g. SGI) implement auto_ptr_ref&lt;Y&gt; with Y* as 
member which is much more reasonable. Other vendor implemented auto_ptr_ref as 
defectively required and it results with awkward and catastrophic code: int oops 
= sink(auto_ptr&lt;B&gt;(source())); // warning recursive on all control paths 
</P>
<P>Dave Abrahams noticed that there is no specification saying that auto_ptr_ref 
copy constructor can't throw. </P>
<P>My proposal comes to solve all the above issues and significantly simplify 
auto_ptr implementation. One of the fundamental requirements from auto_ptr is 
that it can be constructed in an intuitive manner (i.e. like ordinary pointers) 
but with strict ownership semantics which yield that source auto_ptr in 
initialization must be non-const. My idea is to add additional constructor 
template with sole propose to generate ill-formed, diagnostic required, instance 
for const auto_ptr arguments during instantiation of declaration. This special 
constructor will not be instantiated for other types which is achievable using 
14.8.2/2 (SFINAE). Having this constructor in hand makes the constructor 
template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp;) legitimate since 
the actual argument can't be const yet non const r-value are acceptable. </P>
<P>This implementation technique makes the "private auxiliary class" 
auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG, GCC 
and VC) consume the new implementation as expected and allow all intuitive 
initialization and assignment cases while rejecting illegal cases that involve 
const auto_ptr arguments. </P>
<P>The proposed auto_ptr interface:</P><PRE>namespace std {
    template&lt;class X&gt; class auto_ptr {
    public:
        typedef X element_type;

        // 20.4.5.1 construct/copy/destroy:
        explicit auto_ptr(X* p=0) throw();
        auto_ptr(auto_ptr&amp;) throw();
        template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp;) throw();
        auto_ptr&amp; operator=(auto_ptr&amp;) throw();
        template&lt;class Y&gt; auto_ptr&amp; operator=(auto_ptr&lt;Y&gt;) throw();
        ~auto_ptr() throw();

        // 20.4.5.2 members:
        X&amp; operator*() const throw();
        X* operator-&gt;() const throw();
        X* get() const throw();
        X* release() throw();
        void reset(X* p=0) throw();

    private:
        template&lt;class U&gt;
        auto_ptr(U&amp; rhs, typename
unspecified_error_on_const_auto_ptr&lt;U&gt;::type = 0);
    };
}
</PRE>
<P>One compliant technique to implement the unspecified_error_on_const_auto_ptr 
helper class is using additional private auto_ptr member class template like the 
following: </P><PRE>template&lt;typename T&gt; struct unspecified_error_on_const_auto_ptr;

template&lt;typename T&gt;
struct unspecified_error_on_const_auto_ptr&lt;auto_ptr&lt;T&gt; const&gt;
{ typedef typename auto_ptr&lt;T&gt;::const_auto_ptr_is_not_allowed type; };
</PRE>
<P>There are other techniques to implement this helper class that might work 
better for different compliers (i.e. better diagnostics) and therefore I suggest 
defining its semantic behavior without mandating any specific implementation. 
IMO, and I didn't found any compiler that thinks otherwise, 14.7.1/5 doesn't 
theoretically defeat the suggested technique but I suggest verifying this with 
core language experts. </P>
<P><B>Further changes in standard text:</B></P>
<P>Remove section 20.4.5.3</P>
<P>Change 20.4.5/2 to read something like: Initializing auto_ptr&lt;X&gt; from 
const auto_ptr&lt;Y&gt; will result with unspecified ill-formed declaration that 
will require unspecified diagnostic.</P>
<P>Change 20.4.5.1/4,5,6 to read:</P><PRE>template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp; a) throw();</PRE>
<P>4 Requires: Y* can be implicitly converted to X*.</P>
<P>5 Effects: Calls const_cast&lt;auto_ptr&lt;Y&gt;&amp;&gt;(a).release().</P>
<P>6 Postconditions: *this holds the pointer returned from a.release().</P>
<P>Change 20.4.5.1/10</P><PRE>template&lt;class Y&gt; auto_ptr&amp; operator=(auto_ptr&lt;Y&gt; a) throw();
</PRE>
<P>10 Requires: Y* can be implicitly converted to X*. The expression delete 
get() is well formed. </P>
<P>LWG TC DR #127 is obsolete.</P>
<P>Notice that the copy constructor and copy assignment operator should remain 
as before and accept non-const auto_ptr&amp; since they have effect on the form 
of the implicitly declared copy constructor and copy assignment operator of 
class that contains auto_ptr as member per 12.8/5,10: </P><PRE>struct X {
    // implicit X(X&amp;)
    // implicit X&amp; operator=(X&amp;)
    auto_ptr&lt;D&gt; aptr_;
};
</PRE>
<P>In most cases this indicates about sloppy programming but preserves the 
current auto_ptr behavior. </P>
<P>Dave Abrahams encouraged me to suggest fallback implementation in case that 
my suggestion that involves removing of auto_ptr_ref will not be accepted. In 
this case removing the obsolete conversion member to auto_ptr&lt;Y&gt; and 
20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal cases. 
The two constructors that I suggested will co exist with the current members but 
will make auto_ptr_ref obsolete in initialization contexts. auto_ptr_ref will be 
effective in assignment contexts as suggested in DR #127 and I can't see any 
serious exception safety issues in those cases (although it's possible to 
synthesize such). auto_ptr_ref&lt;X&gt; semantics will have to be revised to say 
that it strictly holds pointer of type X and not reference to an auto_ptr for 
the favor of cases in which auto_ptr_ref&lt;Y&gt; is constructed from 
auto_ptr&lt;X&gt; in which X is different from Y (i.e. assignment from r-value 
derived to base). </P>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=464>
<H3>464.&nbsp;Suggestion for new member functions in standard 
containers</H3></A>
<P><B>Section:</B>&nbsp;23.2.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector">[lib.vector]</A>, 
23.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.map">[lib.map]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Thorsten Ottosen&nbsp; <B>Date:</B>&nbsp;12 May 2004</P>
<P>To add slightly more convenience to vector&lt;T&gt; and map&lt;Key,T&gt; we 
should consider to add</P>
<OL>
  <LI>add vector&lt;T&gt;::data() member (const and non-const version) 
  semantics: if( empty() ) return 0; else return buffer_; 
  <LI>add map&lt;Key,T&gt;::at( const Key&amp; k ) member (const and non-const 
  version) <I>semantics</I>: iterator i = find( k ); if( i != end() ) return *i; 
  else throw range_error(); </LI></OL>
<P>Rationale:</P>
<UL>
  <LI>To obtain a pointer to the vector's buffer, one must use either 
  operator[]() (which can give undefined behavior for empty vectors) or at() 
  (which will then throw if the vector is empty). 
  <LI>tr1::array&lt;T,sz&gt; already has a data() member 
  <LI>e cannot use operator[]() when T is not DefaultDonstructible 
  <LI>Neither when the map is const. 
  <LI>when we want to make sure we don't add an element accidently 
  <LI>when it should be considered an error if a key is not in the map </LI></UL>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=465>
<H3>465.&nbsp;Contents of &lt;ciso646&gt;</H3></A>
<P><B>Section:</B>&nbsp;17.4.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.headers">[lib.headers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Steve Clamage&nbsp; <B>Date:</B>&nbsp;3 Jun 2004</P>
<P>C header &lt;iso646.h&gt; defines macros for some operators, such as not_eq 
for !=.</P>
<P>Section 17.4.1.2 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-intro.html#lib.headers">[lib.headers]</A> 
"Headers" says that except as noted in clauses 18 through 27, the &lt;cname&gt; 
C++ header contents are the same as the C header &lt;name.h&gt;. In particular, 
table 12 lists &lt;ciso646&gt; as a C++ header.</P>
<P>I don't find any other mention of &lt;ciso646&gt;, or any mention of 
&lt;iso646.h&gt;, in clauses 17 thorough 27. That implies that the contents of 
&lt;ciso646&gt; are the same as C header &lt;iso646.h&gt;.</P>
<P>Annex C (informative, not normative) in [diff.header.iso646.h] C.2.2.2 
"Header &lt;iso646.h&gt;" says that the alternative tokens are not defined as 
macros in &lt;ciso646&gt;, but does not mention the contents of 
&lt;iso646.h&gt;.</P>
<P>I don't find any normative text to support C.2.2.2.</P>
<P><B>Proposed resolution:</B></P>
<P>Add a section somewhere (clause 18? clause 22?) that says &lt;iso646.h&gt; 
and &lt;ciso646&gt; are empty for C++. </P>
<HR>
<A name=466>
<H3>466.&nbsp;basic_string ctor should prevent null pointer error</H3></A>
<P><B>Section:</B>&nbsp;21.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-strings.html#lib.string.cons">[lib.string.cons]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Daniel Frey&nbsp; <B>Date:</B>&nbsp;10 Jun 2004</P>
<P>Today, my colleagues and me wasted a lot of time. After some time, I found 
the problem. It could be reduced to the following short example: </P><PRE>  #include &lt;string&gt;
  int main() { std::string( 0 ); }
</PRE>
<P>The problem is that the tested compilers (GCC 2.95.2, GCC 3.3.1 and Comeau 
online) compile the above without errors or warnings! The programs (at least for 
the GCC) resulted in a SEGV.</P>
<P>I know that the standard explicitly states that the ctor of string requires a 
char* which is not zero. STLs could easily detect the above case with a private 
ctor for basic_string which takes a single 'int' argument. This would catch the 
above code at compile time and would not ambiguate any other legal ctors.</P>
<P><B>Proposed resolution:</B></P>
<P></P>
<HR>
<A name=467>
<H3>467.&nbsp;char_traits::lt(), compare(), and memcmp()</H3></A>
<P><B>Section:</B>&nbsp;21.1.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-strings.html#lib.char.traits.specializations.char">[lib.char.traits.specializations.char]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;28 Jun 2004</P>
<P>Table 37 describes the requirements on Traits::compare() in terms of those on 
Traits::lt(). 21.1.3.1, p6 requires char_traits&lt;char&gt;::lt() to yield the 
same result as operator&lt;(char, char). </P>
<P>Most, if not all, implementations of char_traits&lt;char&gt;::compare() call 
memcmp() for efficiency. However, the C standard requires both memcmp() and 
strcmp() to interpret characters under comparison as unsigned, regardless of the 
signedness of char. As a result, all these char_traits implementations fail to 
meet the requirement imposed by Table 37 on compare() when char is signed. </P>
<P>Read email thread starting with c++std-lib-13499 for more. </P>
<P><B>Proposed resolution:</B></P>
<P>Change 21.1.3.1, p6 from</P><PRE>    The two-argument members assign, eq, and lt are defined identically
    to the built-in operators =, ==, and &lt; respectively.
</PRE>
<P>to</P><PRE>    The two-argument members assign and eq are defined identically
    to the built-in operators = and == respectively. The two-argument
    member lt is defined identically to the built-in operator &lt; for
    type unsigned char.
</PRE>
<HR>
<A name=468>
<H3>468.&nbsp;unexpected consequences of ios_base::operator void*()</H3></A>
<P><B>Section:</B>&nbsp;27.4.4.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.iostate.flags">[lib.iostate.flags]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;28 Jun 2004</P>
<P>The program below is required to compile but when run it typically produces 
unexpected results due to the user-defined conversion from std::cout or any 
object derived from basic_ios to void*. </P><PRE>    #include &lt;cassert&gt;
    #include &lt;iostream&gt;

    int main ()
    {
        assert (std::cin.tie () == std::cout);
        // calls std::cout.ios::operator void*()
    }
</PRE>
<P><B>Proposed resolution:</B></P>
<P>Replace std::basic_ios&lt;charT, traits&gt;::operator void*() with another 
conversion operator to some unspecified type that is guaranteed not to be 
convertible to any other type except for bool (a pointer-to-member might be one 
such suitable type). In addition, make it clear that the pointer type need not 
be a pointer to a complete type and when non-null, the value need not be valid. 
</P>
<P>Specifically, change in [lib.ios] the signature of</P><PRE>    operator void*() const;
</PRE>
<P>to</P><PRE>    operator unspecified_pointer_type () const;
</PRE>
<P>and change [lib.iostate.flags], p1 from</P><PRE>    operator void*() const;
</PRE>
<P>to</P><PRE>    operator unspecified_pointer_type() const;
    -1- Returns: If fail() then a null pointer; otherwise some
        non-null but not necessarily valid pointer to indicate
        success.
    -2- Note: The type named unspecified_pointer_type above is a pointer
        to some unspecified, possibly incomplete type, that is guaranteed
        not to be convertible to any other type except bool.(Footnote 1)
        --
        Footnote 1: A pointer-to-member might be one such suitable type.
</PRE>
<HR>
<A name=469>
<H3>469.&nbsp;vector&lt;bool&gt; ill-formed relational operators</H3></A>
<P><B>Section:</B>&nbsp;23.2.5 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.vector.bool">[lib.vector.bool]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;28 Jun 2004</P>
<P>The overloads of relational operators for vector&lt;bool&gt; specified in 
[lib.vector.bool] are redundant (they are semantically identical to those 
provided for the vector primary template) and may even be diagnosed as 
ill-formed (refer to Daveed Vandevoorde's explanation in c++std-lib-13647). </P>
<P><B>Proposed resolution:</B></P>
<P>Remove all overloads of overloads of relational operators for 
vector&lt;bool&gt; from [lib.vector.bool]. </P>
<HR>
<A name=470>
<H3>470.&nbsp;accessing containers from their elements' special 
functions</H3></A>
<P><B>Section:</B>&nbsp;23 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.containers">[lib.containers]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;28 Jun 2004</P>
<P>The standard doesn't prohibit the destructors (or any other special 
functions) of containers' elements invoked from a member function of the 
container from "recursively" calling the same (or any other) member function on 
the same container object, potentially while the container is in an intermediate 
state, or even changing the state of the container object while it is being 
modified. This may result in some surprising (i.e., undefined) behavior. </P>
<P>Read email thread starting with c++std-lib-13637 for more.</P>
<P><B>Proposed resolution:</B></P>
<P>Add to Container Requirements the following new paragraph:</P><PRE>    Unless otherwise specified, the behavior of a program that
    invokes a container member function f from a member function
    g of the container's value_type on a container object c that
    called g from its mutating member function h, is undefined.
    I.e., if v is an element of c, directly or indirectly calling
    c.h() from v.g() called from c.f(), is undefined.
</PRE>
<HR>
<A name=471>
<H3>471.&nbsp;result of what() implementation-defined</H3></A>
<P><B>Section:</B>&nbsp;18.6.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-support.html#lib.exception">[lib.exception]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;28 Jun 2004</P>
<P>[lib.exception] specifies the following:</P><PRE>    exception (const exception&amp;) throw();
    exception&amp; operator= (const exception&amp;) throw();

    -4- Effects: Copies an exception object.
    -5- Notes: The effects of calling what() after assignment
        are implementation-defined.
</PRE>
<P>First, does the Note only apply to the assignment operator? If so, what are 
the effects of calling what() on a copy of an object? Is the returned pointer 
supposed to point to an identical copy of the NTBS returned by what() called on 
the original object or not? </P>
<P>Second, is this Note intended to extend to all the derived classes in section 
19? I.e., does the standard provide any guarantee for the effects of what() 
called on a copy of any of the derived class described in section 19? </P>
<P>Finally, if the answer to the first question is no, I believe it constitutes 
a defect since throwing an exception object typically implies invoking the copy 
ctor on the object. If the answer is yes, then I believe the standard ought to 
be clarified to spell out exactly what the effects are on the copy (i.e., after 
the copy ctor was called). </P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=472>
<H3>472.&nbsp;Missing "Returns" clause in std::equal_range</H3></A>
<P><B>Section:</B>&nbsp;25.3.3.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.equal.range">[lib.equal.range]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Prateek R Karandikar&nbsp; <B>Date:</B>&nbsp;29 Feb 
1900</P>
<P>There is no "Returns:" clause for std::equal_range, which returns non-void. 
</P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=473>
<H3>473.&nbsp;underspecified ctype calls</H3></A>
<P><B>Section:</B>&nbsp;22.2.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-locales.html#lib.locale.ctype">[lib.locale.ctype]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;1 Jul 2004</P>
<P>Most ctype member functions come in two forms: one that operates on a single 
character at a time and another form that operates on a range of characters. 
Both forms are typically described by a single Effects and/or Returns clause. 
</P>
<P>The Returns clause of each of the single-character non-virtual forms suggests 
that the function calls the corresponding single character virtual function, and 
that the array form calls the corresponding virtual array form. Neither of the 
two forms of each virtual member function is required to be implemented in terms 
of the other. </P>
<P>There are three problems: </P>
<P>1. One is that while the standard does suggest that each non-virtual member 
function calls the corresponding form of the virtual function, it doesn't 
actually explicitly require it. </P>
<P>Implementations that cache results from some of the virtual member functions 
for some or all values of their arguments might want to call the array form from 
the non-array form the first time to fill the cache and avoid any or most 
subsequent virtual calls. Programs that rely on each form of the virtual 
function being called from the corresponding non-virtual function will see 
unexpected behavior when using such implementations. </P>
<P>2. The second problem is that either form of each of the virtual functions 
can be overridden by a user-defined function in a derived class to return a 
value that is different from the one produced by the virtual function of the 
alternate form that has not been overriden. </P>
<P>Thus, it might be possible for, say, ctype::widen(c) to return one value, 
while for ctype::widen(&amp;c, &amp;c + 1, &amp;wc) to set wc to another value. 
This is almost certainly not intended. Both forms of every function should be 
required to return the same result for the same character, otherwise the same 
program using an implementation that calls one form of the functions will behave 
differently than when using another implementation that calls the other form of 
the function "under the hood." </P>
<P>3. The last problem is that the standard text fails to specify whether one 
form of any of the virtual functions is permitted to be implemented in terms of 
the other form or not, and if so, whether it is required or permitted to call 
the overridden virtual function or not. </P>
<P>Thus, a program that overrides one of the virtual functions so that it calls 
the other form which then calls the base member might end up in an infinite loop 
if the called form of the base implementation of the function in turn calls the 
other form. </P>
<P><B>Proposed resolution:</B></P>
<P>To fix these problems I propose the following: </P>
<P>Add two paragraphs immediately after 22.2.1.1 [lib.locale.ctype], p2, with 
the following text: </P><PRE>  -3- Each ctype non-virtual member function that comes in two forms,
      one that takes a range of elements of char_type, and another
      that takes just a single element of char_type, is required to
      call the corresponding form of the virtual member function
      with the same value of char_type to obtain the result. The
      result for the same argument may be cached and returned from
      subsequent calls to either form of the non-virtual member
      function with that argument.

  -4- For each ctype virtual member function that comes in two forms
      (as explained above), the single element form is required to
      produce the same result for a character c that the corresponding
      array form produces for the array element with the same value as
      c, and vice versa.

  -5- It is unspecified whether the array form of each virtual member
      function calls the single-element virtual overload of the same
      function in a loop, or whether the single element form calls
      the array form with an array of a single element with the value
      of its argument, or whether neither form calls the other. In
      any case, an implementation is not permitted to make calls from
      one form of any virtual member function to the corresponding
      other form that is overridden in a derived class.
</PRE>
<HR>
<A name=474>
<H3>474.&nbsp;confusing Footnote 297</H3></A>
<P><B>Section:</B>&nbsp;27.6.2.5.4 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iostreams.html#lib.ostream.inserters.character">[lib.ostream.inserters.character]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Martin Sebor&nbsp; <B>Date:</B>&nbsp;1 Jul 2004</P>
<P>I think Footnote 297 is confused. The paragraph it applies to seems quite 
clear in that widen() is only called if the object is not a char stream (i.e., 
not basic_ostream&lt;char&gt;), so it's irrelevant what the value of widen(c) is 
otherwise. </P>
<P><B>Proposed resolution:</B></P>
<P>I propose to strike the Footnote. </P>
<HR>
<A name=475>
<H3>475.&nbsp;May the function object passed to for_each modify the elements of 
the iterated sequence?</H3></A>
<P><B>Section:</B>&nbsp;25.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.foreach">[lib.alg.foreach]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Stephan T. Lavavej, Jaakko Jarvi&nbsp; 
<B>Date:</B>&nbsp;9 Jul 2004</P>
<P>It is not clear whether the function object passed to for_each is allowed to 
modify the elements of the sequence being iterated over. </P>
<P>for_each is classified without explanation in [lib.alg.nonmodifying], "25.1 
Non-modifying sequence operations". 'Non-modifying sequence operation' is never 
defined. </P>
<P>25(5) says: "If an algorithm's Effects section says that a value pointed to 
by any iterator passed as an argument is modified, then that algorithm has an 
additional type requirement: The type of that argument shall satisfy the 
requirements of a mutable iterator (24.1)." </P>
<P>for_each's Effects section does not mention whether arguments can be 
modified:</P>
<BLOCKQUOTE>"Effects: Applies f to the result of dereferencing every iterator 
  in the range [first, last), starting from first and proceeding to last - 1." 
</BLOCKQUOTE>
<P>Every other algorithm in [lib.alg.nonmodifying] is "really" non-modifying in 
the sense that neither the algorithms themselves nor the function objects passed 
to the algorithms may modify the sequences or elements in any way. This DR 
affects only for_each. </P>
<P>We suspect that for_each's classification in "non-modifying sequence 
operations" means that the algorithm itself does not inherently modify the 
sequence or the elements in the sequence, but that the function object passed to 
it may modify the elements it operates on. </P>
<P>The original STL document by Stepanov and Lee explicitly prohibited the 
function object from modifying its argument. The "obvious" implementation of 
for_each found in several standard library implementations, however, does not 
impose this restriction. As a result, we suspect that the use of for_each with 
function objects that modify their arguments is wide-spread. If the restriction 
was reinstated, all such code would become non-conforming. Further, none of the 
other algorithms in the Standard could serve the purpose of for_each (transform 
does not guarantee the order in which its function object is called). </P>
<P>We suggest that the standard be clarified to explicitly allow the function 
object passed to for_each modify its argument.</P>
<P><B>Proposed resolution:</B></P>
<P>Add the following sentence to the Effects in 25.1.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.foreach">[lib.alg.foreach]</A>:</P>
<BLOCKQUOTE>"f may apply non-constant functions through the dereferenced 
  iterators passed to it; if it does, the type of first shall satisfy the 
  requirements of a mutable iterator (24.1)." </BLOCKQUOTE>
<HR>
<A name=476>
<H3>476.&nbsp;Forward Iterator implied mutability</H3></A>
<P><B>Section:</B>&nbsp;24.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.forward.iterators">[lib.forward.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;9 Jul 2004</P>
<P>24.1/3 says:</P>
<BLOCKQUOTE>Forward iterators satisfy all the requirements of the input and 
  output iterators and can be used whenever either kind is specified </BLOCKQUOTE>
<P>The problem is that satisfying the requirements of output iterator means that 
you can always assign *something* into the result of dereferencing it. That 
makes almost all non-mutable forward iterators non-conforming. I think we need 
to sever the refinement relationship between forward iterator and output 
iterator. </P>
<P><B>Proposed resolution:</B></P>
<P>in 24.1/3, replace:</P>
<BLOCKQUOTE>Forward iterators satisfy all the requirements of the input and 
  output iterators and can be used whenever either kind is specified. 
</BLOCKQUOTE>
<P>with</P>
<BLOCKQUOTE>A forward iterator satisfies all the input iterator requirements. 
  A mutable forward iterator satisfies all the output iterator requirements. 
</BLOCKQUOTE>
<HR>
<A name=477>
<H3>477.&nbsp;Operator-&gt; for const forward iterators</H3></A>
<P><B>Section:</B>&nbsp;24.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.forward.iterators">[lib.forward.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;11 Jul 2004</P>
<P>The Forward Iterator requirements table contains the following: </P><PRE> expression  return type         operational  precondition
                                  semantics
  ==========  ==================  ===========  ==========================
  a-&gt;m        U&amp; if X is mutable, (*a).m       pre: (*a).m is well-defined.
              otherwise const U&amp;

  r-&gt;m        U&amp;                  (*r).m       pre: (*r).m is well-defined.
</PRE>
<P>The first line is exactly right. The second line is wrong. Basically it 
implies that the const-ness of the iterator affects the const-ness of referenced 
members. But Paragraph 11 of [lib.iterator.requirements] says: </P>
<BLOCKQUOTE>In the following sections, a and b denote values of type const X, 
  n denotes a value of the difference type Distance, u, tmp, and m denote 
  identifiers, r denotes a value of X&amp;, t denotes a value of value type T, o 
  denotes a value of some type that is writable to the output iterator. 
</BLOCKQUOTE>
<P>AFAICT if we need the second line at all, it should read the same as the 
first line.</P>
<P>Related issue: <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#478">478</A></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=478>
<H3>478.&nbsp;Should forward iterator requirements table have a line for 
r-&gt;m?</H3></A>
<P><B>Section:</B>&nbsp;24.1.3 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-iterators.html#lib.forward.iterators">[lib.forward.iterators]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Dave Abrahams&nbsp; <B>Date:</B>&nbsp;11 Jul 2004</P>
<P>The Forward Iterator requirements table contains the following: </P><PRE> expression  return type         operational  precondition
                                  semantics
  ==========  ==================  ===========  ==========================
  a-&gt;m        U&amp; if X is mutable, (*a).m       pre: (*a).m is well-defined.
              otherwise const U&amp;

  r-&gt;m        U&amp;                  (*r).m       pre: (*r).m is well-defined.
</PRE>
<P>The second line may be unnecessary. Paragraph 11 of 
[lib.iterator.requirements] says: </P>
<BLOCKQUOTE>In the following sections, a and b denote values of type const X, 
  n denotes a value of the difference type Distance, u, tmp, and m denote 
  identifiers, r denotes a value of X&amp;, t denotes a value of value type T, o 
  denotes a value of some type that is writable to the output iterator. 
</BLOCKQUOTE>
<P>Because operators can be overloaded on an iterator's const-ness, the current 
requirements allow iterators to make many of the operations specified using the 
identifiers a and b invalid for non-const iterators. Rather than expanding the 
tables, I think the right answer is to change </P>
<BLOCKQUOTE>"const X" </BLOCKQUOTE>
<P>to </P>
<BLOCKQUOTE>"X or const X" </BLOCKQUOTE>
<P>in paragraph 11 of [lib.iterator.requirements].</P>
<P>Related issue: <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#477">477</A></P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=479>
<H3>479.&nbsp;Container requirements and placement new</H3></A>
<P><B>Section:</B>&nbsp;23.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-containers.html#lib.container.requirements">[lib.container.requirements]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Herb Sutter&nbsp; <B>Date:</B>&nbsp;1 Aug 2004</P>
<P>Nothing in the standard appears to make this program ill-formed:</P><PRE>  struct C {
    void* operator new( size_t s ) { return ::operator new( s ); }
    // NOTE: this hides in-place and nothrow new
  };

  int main() {
    vector&lt;C&gt; v;
    v.push_back( C() );
  }
</PRE>
<P>Is that intentional? We should clarify whether or not we intended to require 
containers to support types that define their own special versions of 
<TT>operator new</TT>.</P>
<P><B>Proposed resolution:</B></P>
<HR>
<A name=480>
<H3>480.&nbsp;unary_function and binary_function should have protected 
nonvirtual destructors</H3></A>
<P><B>Section:</B>&nbsp;20.3.1 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-utilities.html#lib.base">[lib.base]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Joe Gottman&nbsp; <B>Date:</B>&nbsp;19 Aug 2004</P>
<P>The classes std::unary_function and std::binary_function are both designed to 
be inherited from but contain no virtual functions. This makes it too easy for a 
novice programmer to write code like binary_function&lt;int, int, int&gt; *p = 
new plus&lt;int&gt;; delete p;</P>
<P>There are two common ways to prevent this source of undefined behavior: give 
the base class a public virtual destructor, or give it a protected nonvirtual 
destructor. Since unary_function and binary_function have no other virtual 
functions, (note in particular the absence of an operator()() ), it would cost 
too much to give them public virtual destructors. Therefore, they should be 
given protected nonvirtual destructors.</P>
<P><B>Proposed resolution:</B></P>
<P>Change Paragraph 20.3.1 of the Standard from</P><PRE>    template &lt;class Arg, class Result&gt;
    struct unary_function {
        typedef Arg argument_type;
        typedef Result result_type;
    };

    template &lt;class Arg1, class Arg2, class Result&gt;
    struct binary_function {
        typedef Arg1 first_argument_type;
        typedef Arg2 second_argument_type;
        typedef Result result_type;
    };
</PRE>
<P>to</P><PRE>    template &lt;class Arg, class Result&gt;
        struct unary_function {
        typedef Arg argument_type;
        typedef Result result_type;
    protected:
        ~unary_function() {}
    };

    template &lt;class Arg1, class Arg2, class Result&gt;
    struct binary_function {
        typedef Arg1 first_argument_type;
        typedef Arg2 second_argument_type;
        typedef Result result_type;
    protected:
        ~binary_function() {}
    };
</PRE>
<HR>
<A name=481>
<H3>481.&nbsp;unique's effects on the range [result, last)</H3></A>
<P><B>Section:</B>&nbsp;25.2.8 <A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lib-algorithms.html#lib.alg.unique">[lib.alg.unique]</A>&nbsp; 
<B>Status:</B>&nbsp;<A 
href="file:///C:/Documents%20and%20Settings/jward4/Local%20Settings/Temp/lwg-active.html#New">New</A>&nbsp; 
<B>Submitter:</B>&nbsp;Andrew Koenig&nbsp; <B>Date:</B>&nbsp;30 Aug 2004</P>
<P>The standard says that unique(first, last) "eliminates all but the first 
element from every consecutive group of equal elements" in [first, last) and 
returns "the end of the resulting range". So a postcondition is that [first, 
result) is the same as the old [first, last) except that duplicates have been 
eliminated. </P>
<P>What postconditions are there on the range [result, last)? One might argue 
that the standard says nothing about those values, so they can be anything. One 
might also argue that the standard doesn't permit those values to be changed, so 
they must not be. Should the standard say something explicit one way or the 
other?</P>
<P><B>Proposed resolution:</B></P>
<P></P>
<P>----- End of document -----</P></LI></BODY></HTML>
