]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libstdc++-v3/contrib/libstdc++-v3-4.1.0/docs/html/ext/lwg-active.html
update
[l4.git] / l4 / pkg / libstdc++-v3 / contrib / libstdc++-v3-4.1.0 / docs / html / ext / lwg-active.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
2 <html><head><title>C++ Standard Library Active Issues List</title></head>
3
4 <body bgcolor="#ffffff" text="#000000">
5 <table>
6 <tbody><tr>
7 <td align="left">Doc. no.</td>
8 <td align="left">N1908=05-0168</td>
9 </tr>
10 <tr>
11 <td align="left">Date:</td>
12 <td align="left">2005-10-23</td>
13 </tr>
14 <tr>
15 <td align="left">Project:</td>
16 <td align="left">Programming Language C++</td>
17 </tr>
18 <tr>
19 <td align="left">Reply to:</td>
20 <td align="left">Howard Hinnant &lt;howard.hinnant@gmail.com&gt;</td>
21 </tr>
22 </tbody></table>
23 <h1>C++ Standard Library Active Issues List (Revision R39)</h1>
24   <p>Reference ISO/IEC IS 14882:1998(E)</p>
25   <p>Also see:</p>
26   <ul>
27       <li>
28 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-toc.html">Table of Contents</a> for all library issues.</li>
29       <li>
30 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-index.html">Index by Section</a> for all library issues.</li>
31       <li>
32 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-status.html">Index by Status</a> for all library issues.</li>
33       <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html">Library Defect Reports List</a></li>
34       <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html">Library Closed Issues List</a></li>
35   </ul>
36   <p>The purpose of this document is to record the status of issues
37   which have come before the Library Working Group (LWG) of the ANSI
38   (J16) and ISO (WG21) C++ Standards Committee. Issues represent
39   potential defects in the ISO/IEC IS 14882:1998(E) document.  Issues
40   are not to be used to request new features. </p>
41
42   <p>This document contains only library issues which are actively being
43   considered by the Library Working Group. That is, issues which have a
44   status of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>, 
45   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>, and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>. See
46   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html">Library Defect Reports List</a> for issues considered defects and 
47   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html">Library Closed Issues List</a> for issues considered closed.</p>
48
49   <p>The issues in these lists are not necessarily formal ISO Defect
50   Reports (DR's). While some issues will eventually be elevated to
51   official Defect Report status, other issues will be disposed of in
52   other ways. See <a href="#Status">Issue Status</a>.</p>
53
54   <p>This document is in an experimental format designed for both
55   viewing via a world-wide web browser and hard-copy printing. It
56   is available as an HTML file for browsing or PDF file for
57   printing.</p>
58
59   <p>Prior to Revision 14, library issues lists existed in two slightly
60   different versions; a Committee Version and a Public
61   Version. Beginning with Revision 14 the two versions were combined
62   into a single version.</p>
63
64   <p>This document includes <i>[bracketed italicized notes]</i> as a
65   reminder to the LWG of current progress on issues. Such notes are
66   strictly unofficial and should be read with caution as they may be
67   incomplete or incorrect. Be aware that LWG support for a particular
68   resolution can quickly change if new viewpoints or killer examples are
69   presented in subsequent discussions.</p>
70
71   <p>For the most current official version of this document see 
72   <a href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21/</a>.
73   Requests for further information about this document should include
74   the document number above, reference ISO/IEC 14882:1998(E), and be
75   submitted to Information Technology Industry Council (ITI), 1250 Eye
76   Street NW, Washington, DC 20005.</p>
77
78   <p>Public information as to how to obtain a copy of the C++ Standard,
79   join the standards committee, submit an issue, or comment on an issue
80   can be found in the comp.std.c++ FAQ.
81   Public discussion of C++ Standard related issues occurs on <a href="news://comp.std.c++/">news:comp.std.c++</a>.
82   </p>
83
84  <p>For committee members, files available on the committee's private
85   web site include the HTML version of the Standard itself. HTML
86   hyperlinks from this issues list to those files will only work for
87   committee members who have downloaded them into the same disk
88   directory as the issues list files.  </p>
89 <h2>Revision History</h2>
90 <ul>
91 <li>R39: 
92 2005-10-14 post-Mont Tremblant mailing.
93 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#526">526</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#528">528</a>.
94 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#280">280</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#461">461</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#464">464</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#465">465</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#467">467</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#468">468</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#474">474</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#496">496</a> from Ready to WP as per the vote from Mont Tremblant.
95 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#247">247</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#294">294</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#342">342</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#362">362</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#369">369</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#371">371</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#376">376</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#384">384</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#475">475</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#478">478</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#495">495</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#497">497</a> from Review to Ready.
96 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#498">498</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#504">504</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#506">506</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#509">509</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#510">510</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#511">511</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#512">512</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#513">513</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#514">514</a> from New to Open.
97 Moved issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#505">505</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#507">507</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#508">508</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#519">519</a> from New to Ready.
98 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#500">500</a> from New to NAD.
99 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#518">518</a> from New to Review.
100 </li>
101 <li>R38: 
102 2005-07-03 pre-Mont Tremblant mailing.
103 Merged open TR1 issues in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#504">504</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#522">522</a>.
104 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#523">523</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#523">523</a>
105 </li>
106 <li>R37: 
107 2005-06 mid-term mailing.
108 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#498">498</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#503">503</a>.
109 </li>
110 <li>R36: 
111 2005-04 post-Lillehammer mailing. All issues in "ready" status except
112 for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#454">454</a> were moved to "DR" status, and all issues
113 previously in "DR" status were moved to "WP".
114 </li>
115 <li>R35: 
116 2005-03 pre-Lillehammer mailing.
117 </li>
118 <li>R34: 
119 2005-01 mid-term mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#488">488</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#494">494</a>.
120 </li>
121 <li>R33: 
122 2004-11 post-Redmond mailing. Reflects actions taken in Redmond.
123 </li>
124 <li>R32: 
125 2004-09 pre-Redmond mailing: reflects new proposed resolutions and
126 new issues received after the 2004-07 mailing.  Added
127 new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#479">479</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#481">481</a>.
128 </li>
129 <li>R31: 
130 2004-07 mid-term mailing: reflects new proposed resolutions and
131 new issues received after the post-Sydney mailing.  Added
132 new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#463">463</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#478">478</a>.
133 </li>
134 <li>R30: 
135 Post-Sydney mailing: reflects decisions made at the Sydney meeting.
136 Voted all "Ready" issues from R29 into the working paper.
137 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#460">460</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#462">462</a>.
138 </li>
139 <li>R29: 
140 Pre-Sydney mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#441">441</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#457">457</a>.
141 </li>
142 <li>R28: 
143 Post-Kona mailing: reflects decisions made at the Kona meeting.
144 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#432">432</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#440">440</a>.
145 </li>
146 <li>R27: 
147 Pre-Kona mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#404">404</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#431">431</a>.
148 </li>
149 <li>R26: 
150 Post-Oxford mailing: reflects decisions made at the Oxford meeting.
151 All issues in Ready status were voted into DR status.  All issues in
152 DR status were voted into WP status.
153 </li>
154 <li>R25: 
155 Pre-Oxford mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#390">390</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#402">402</a>.
156 </li>
157 <li>R24: 
158 Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz
159 meeting.  All Ready issues from R23 with the exception of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#253">253</a>, which has been given a new proposed resolution, were
160 moved to DR status.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#383">383</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#389">389</a>.  (Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#387">387</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#389">389</a> were discussed
161 at the meeting.)  Made progress on issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#229">229</a>: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#229">229</a> have been moved to Ready status, and the only remaining
162 concerns with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a> involve wording.
163 </li>
164 <li>R23: 
165 Pre-Santa Cruz mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#367">367</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#382">382</a>.
166 Moved issues in the TC to TC status.
167 </li>
168 <li>R22: 
169 Post-Curaçao mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#362">362</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#366">366</a>.
170 </li>
171 <li>R21: 
172 Pre-Curaçao mailing.  Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#351">351</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#361">361</a>.
173 </li>
174 <li>R20: 
175 Post-Redmond mailing; reflects actions taken in Redmond.  Added
176 new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#336">336</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#350">350</a>, of which issues 
177 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#347">347</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#350">350</a> were added since Redmond, hence
178 not discussed at the meeting.  
179
180 All Ready issues were moved to DR status, with the exception of issues
181 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#284">284</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#241">241</a>, and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#267">267</a>.
182
183 Noteworthy issues discussed at Redmond include 
184 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#120">120</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#202">202</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#233">233</a>, 
185 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#270">270</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#253">253</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#254">254</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#323">323</a>.
186 </li>
187 <li>R19: 
188 Pre-Redmond mailing.  Added new issues 
189 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#323">323</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#335">335</a>.
190 </li>
191 <li>R18: 
192 Post-Copenhagen mailing; reflects actions taken in Copenhagen.
193 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#312">312</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#317">317</a>, and discussed
194 new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#271">271</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#314">314</a>.
195
196 Changed status of issues
197 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103">103</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#118">118</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#136">136</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#153">153</a>
198 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#165">165</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#171">171</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#183">183</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#184">184</a>
199 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#185">185</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#186">186</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#214">214</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#221">221</a>
200 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#234">234</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#237">237</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#243">243</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#248">248</a>
201 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#251">251</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#252">252</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#256">256</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#260">260</a>
202 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#261">261</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#262">262</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263">263</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#265">265</a>
203 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#268">268</a>
204 to DR.
205
206 Changed status of issues
207 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#49">49</a>  <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109">109</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#117">117</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#182">182</a>
208 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#228">228</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#230">230</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#232">232</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>
209 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#238">238</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#241">241</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#242">242</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#250">250</a>
210 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#259">259</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#264">264</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#266">266</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#267">267</a>
211 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#271">271</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#272">272</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#273">273</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#275">275</a>
212 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#281">281</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#284">284</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#285">285</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#286">286</a>
213 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#288">288</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#292">292</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#295">295</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#297">297</a>
214 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#298">298</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#301">301</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#303">303</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#306">306</a>
215 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#307">307</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#308">308</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#312">312</a>
216 to Ready.
217
218 Closed issues 
219 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#111">111</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#277">277</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279">279</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#287">287</a>
220 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#289">289</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#293">293</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#302">302</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#313">313</a>
221 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#314">314</a>
222 as NAD.
223
224 </li>
225 <li>R17: 
226 Pre-Copenhagen mailing.  Converted issues list to XML.  Added proposed
227 resolutions for issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#49">49</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#76">76</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#91">91</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#250">250</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#267">267</a>.
228 Added new issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#278">278</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#311">311</a>.
229 </li>
230 <li>R16:  
231 post-Toronto mailing; reflects actions taken in Toronto. Added new
232 issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#265">265</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#277">277</a>.  Changed status of issues
233 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#3">3</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#8">8</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#9">9</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#19">19</a>,
234 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#26">26</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#31">31</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#61">61</a>,
235 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#63">63</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#86">86</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#108">108</a>,
236 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#112">112</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#114">114</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#115">115</a>,
237 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#122">122</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#127">127</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#129">129</a>,
238 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#134">134</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#137">137</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#142">142</a>,
239 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#144">144</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#146">146</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#147">147</a>,
240 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#159">159</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#164">164</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#170">170</a>,
241 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#181">181</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#199">199</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#208">208</a>,
242 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#209">209</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#210">210</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#211">211</a>,
243 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#212">212</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#217">217</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#220">220</a>,
244 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#222">222</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#223">223</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#224">224</a>,
245 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#227">227</a> to "DR".  Reopened issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#23">23</a>. Reopened
246 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#187">187</a>. Changed issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#2">2</a> and
247 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#4">4</a> to NAD. Fixed a typo in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a>. Fixed
248 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#70">70</a>: signature should be changed both places it
249 appears. Fixed issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#160">160</a>: previous version didn't fix
250 the bug in enough places.
251 </li>
252 <li>R15: 
253 pre-Toronto mailing. Added issues
254 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#233">233</a>-<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#264">264</a>. Some small HTML formatting
255 changes so that we pass Weblint tests.
256 </li>
257 <li>R14: 
258 post-Tokyo II mailing; reflects committee actions taken in
259 Tokyo. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#228">228</a> to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#232">232</a>. (00-0019R1/N1242)
260 </li>
261 <li>R13: 
262 pre-Tokyo II updated: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#212">212</a> to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#227">227</a>.
263 </li>
264 <li>R12: 
265 pre-Tokyo II mailing: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#199">199</a> to
266 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#211">211</a>. Added "and paragraph 5" to the proposed resolution
267 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#29">29</a>.  Add further rationale to issue
268 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#178">178</a>.
269 </li>
270 <li>R11: 
271 post-Kona mailing: Updated to reflect LWG and full committee actions
272 in Kona (99-0048/N1224). Note changed resolution of issues
273 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#4">4</a> and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#196">196</a>
274 to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198">198</a>. Closed issues list split into "defects" and
275 "closed" documents.  Changed the proposed resolution of issue
276 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#4">4</a> to NAD, and changed the wording of proposed resolution
277 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>.
278 </li>
279 <li>R10: 
280 pre-Kona updated.  Added proposed resolutions <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</a>,
281 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#86">86</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#91">91</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#92">92</a>,
282 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109">109</a>. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#190">190</a> to
283 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a>. (99-0033/D1209, 14 Oct 99)
284 </li>
285 <li>R9: 
286 pre-Kona mailing.  Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a> to
287 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#189">189</a>. Issues list split into separate "active" and
288 "closed" documents. (99-0030/N1206, 25 Aug 99)
289 </li>
290 <li>R8: 
291 post-Dublin mailing. Updated to reflect LWG and full committee actions
292 in Dublin. (99-0016/N1193, 21 Apr 99)
293 </li>
294 <li>R7: 
295 pre-Dublin updated: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130">130</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#131">131</a>,
296 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#132">132</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#133">133</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#134">134</a>,
297 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#135">135</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#136">136</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#137">137</a>,
298 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#138">138</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#139">139</a> (31 Mar 99)
299 </li>
300 <li>R6: 
301 pre-Dublin mailing. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#127">127</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#128">128</a>,
302 and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#129">129</a>.  (99-0007/N1194, 22 Feb 99)
303 </li>
304 <li>R5: 
305 update issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103">103</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#112">112</a>; added issues
306 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#114">114</a> to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#126">126</a>. Format revisions to prepare
307 for making list public. (30 Dec 98)
308 </li>
309 <li>R4: 
310 post-Santa Cruz II updated: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</a>,
311 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#111">111</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#112">112</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#113">113</a> added, several
312 issues corrected. (22 Oct 98)
313 </li>
314 <li>R3: 
315 post-Santa Cruz II: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94">94</a> to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109">109</a>
316 added, many issues updated to reflect LWG consensus (12 Oct 98)
317 </li>
318 <li>R2: 
319 pre-Santa Cruz II: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#73">73</a> to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#93">93</a> added,
320 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a> updated. (29 Sep 98)
321 </li>
322 <li>R1: 
323 Correction to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#55">55</a> resolution, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#60">60</a> code
324 format, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#64">64</a> title. (17 Sep 98)
325 </li>
326 </ul>
327 <h2>
328 <a name="Status"></a>Issue Status</h2>
329   <p><b><a name="New">New</a></b> - The issue has not yet been
330   reviewed by the LWG. Any <b>Proposed Resolution</b> is purely a
331   suggestion from the issue submitter, and should not be construed as
332   the view of LWG.</p>
333
334   <p><b><a name="Open">Open</a></b> - The LWG has discussed the issue
335   but is not yet ready to move the issue forward. There are several
336   possible reasons for open status:</p>
337      <ul>
338         <li>Consensus may have not yet have been reached as to how to deal
339             with the issue.</li>
340         <li>Informal consensus may have been reached, but the LWG awaits
341             exact <b>Proposed Resolution</b> wording for review.</li>
342         <li>The LWG wishes to consult additional technical experts before
343             proceeding.</li>
344         <li>The issue may require further study.</li>
345      </ul>
346
347   <p>A <b>Proposed Resolution</b> for an open issue is still not be
348   construed as the view of LWG. Comments on the current state of
349   discussions are often given at the end of open issues in an italic
350   font. Such comments are for information only and should not be given
351   undue importance.</p>
352
353   <p><b><a name="Dup">Dup</a></b> - The LWG has reached consensus that
354   the issue is a duplicate of another issue, and will not be further
355   dealt with. A <b>Rationale</b> identifies the duplicated issue's
356   issue number.  </p>
357
358   <p><b><a name="NAD">NAD</a></b> - The LWG has reached consensus that
359   the issue is not a defect in the Standard, and the issue is ready to
360   forward to the full committee as a proposed record of response. A
361   <b>Rationale</b> discusses the LWG's reasoning.</p>
362
363   <p><b><a name="Review">Review</a></b> - Exact wording of a
364   <b>Proposed Resolution</b> is now available for review on an issue
365   for which the LWG previously reached informal consensus.</p>
366
367   <p><b><a name="Ready">Ready</a></b> - The LWG has reached consensus
368   that the issue is a defect in the Standard, the <b>Proposed
369   Resolution</b> is correct, and the issue is ready to forward to the
370   full committee for further action as a Defect Report (DR).</p>
371
372   <p><b><a name="DR">DR</a></b> - (Defect Report) - The full J16
373   committee has voted to forward the issue to the Project Editor to be
374   processed as a Potential Defect Report. The Project Editor reviews
375   the issue, and then forwards it to the WG21 Convenor, who returns it
376   to the full committee for final disposition. This issues list
377   accords the status of DR to all these Defect Reports regardless of
378   where they are in that process.</p>
379
380   <p><b><a name="TC">TC</a></b> - (Technical Corrigenda) - The full
381   WG21 committee has voted to accept the Defect Report's Proposed
382   Resolution as a Technical Corrigenda.  Action on this issue is thus
383   complete and no further action is possible under ISO rules.</p>
384
385   <p><b><a name="WP">WP</a></b> - (Working Paper) - The proposed
386   resolution has not been accepted as a Technical Corrigendum, but
387   the full WG21 committee has voted to apply the Defect Report's Proposed
388   Resolution to the working paper.</p>
389
390   <p><b><a name="RR">RR</a></b> - (Record of Response) - The full WG21
391   committee has determined that this issue is not a defect in the
392   Standard. Action on this issue is thus complete and no further
393   action is possible under ISO rules.</p>
394
395   <p><b><a name="Future">Future</a></b> - In addition to the regular
396   status, the LWG believes that this issue should be revisited at the
397   next revision of the standard.  It is usually paired with NAD.</p>
398
399   <p>Issues are always given the status of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a> when
400   they first appear on the issues list. They may progress to
401   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a> or <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a> while the LWG
402   is actively working on them. When the LWG has reached consensus on
403   the disposition of an issue, the status will then change to
404   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Dup">Dup</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#NAD">NAD</a>, or <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a> as appropriate.  Once the full J16 committee votes to
405   forward Ready issues to the Project Editor, they are given the
406   status of Defect Report ( <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>). These in turn may
407   become the basis for Technical Corrigenda (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>),
408   or are closed without action other than a Record of Response
409   (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#RR">RR</a> ). The intent of this LWG process is that
410   only issues which are truly defects in the Standard move to the
411   formal ISO DR status.
412   </p>
413
414 <h2>Active Issues</h2>
415 <hr>
416 <a name="23"><h3>23.&nbsp;Num_get overflow result</h3></a><p><b>Section:</b>&nbsp;22.2.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.virtuals"> [lib.facet.num.get.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
417 <p>The current description of numeric input does not account for the
418 possibility of overflow. This is an implicit result of changing the
419 description to rely on the definition of scanf() (which fails to
420 report overflow), and conflicts with the documented behavior of
421 traditional and current implementations. </p>
422
423 <p>Users expect, when reading a character sequence that results in a
424 value unrepresentable in the specified type, to have an error
425 reported. The standard as written does not permit this. </p>
426
427 <p><b>Further comments from Dietmar:</b></p>
428
429 <p>
430 I don't feel comfortable with the proposed resolution to issue 23: It
431 kind of simplifies the issue to much. Here is what is going on:
432 </p>
433
434 <p>
435 Currently, the behavior of numeric overflow is rather counter intuitive
436 and hard to trace, so I will describe it briefly:
437 </p>
438
439 <ul>
440   <li>
441     According to 22.2.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.virtuals"> [lib.facet.num.get.virtuals]</a>
442     paragraph 11 <tt>failbit</tt> is set if <tt>scanf()</tt> would
443     return an input error; otherwise a value is converted to the rules
444     of <tt>scanf</tt>.
445   </li>
446   <li> 
447     <tt>scanf()</tt> is defined in terms of <tt>fscanf()</tt>. 
448   </li>
449   <li>
450     <tt>fscanf()</tt> returns an input failure if during conversion no
451     character matching the conversion specification could be extracted
452     before reaching EOF. This is the only reason for <tt>fscanf()</tt>
453     to fail due to an input error and clearly does not apply to the case
454     of overflow.
455   </li>
456   <li>
457     Thus, the conversion is performed according to the rules of
458     <tt>fscanf()</tt> which basically says that <tt>strtod</tt>,
459     <tt>strtol()</tt>, etc. are to be used for the conversion.
460   </li>
461   <li>
462     The <tt>strtod()</tt>, <tt>strtol()</tt>, etc. functions consume as
463     many matching characters as there are and on overflow continue to
464     consume matching characters but also return a value identical to
465     the maximum (or minimum for signed types if there was a leading minus)
466     value of the corresponding type and set <tt>errno</tt> to <tt>ERANGE</tt>.
467   </li>
468   <li>
469     Thus, according to the current wording in the standard, overflows
470     can be detected! All what is to be done is to check <tt>errno</tt>
471     after reading an element and, of course, clearing <tt>errno</tt>
472     before trying a conversion. With the current wording, it can be
473     detected whether the overflow was due to a positive or negative
474     number for signed types.
475   </li>
476 </ul>
477
478 <p><b>Further discussion from Redmond:</b></p>
479
480 <p>The basic problem is that we've defined our behavior,
481 including our error-reporting behavior, in terms of C90.  However,
482 C90's method of reporting overflow in scanf is not technically an
483 "input error".  The <tt>strto_*</tt> functions are more precise.</p>
484
485 <p>There was general consensus that <tt>failbit</tt> should be set
486 upon overflow.  We considered three options based on this:</p>
487 <ol>
488 <li>Set failbit upon conversion error (including overflow), and 
489     don't store any value.</li>
490 <li>Set failbit upon conversion error, and also set <tt>errno</tt> to 
491     indicated the precise nature of the error.</li>
492 <li>Set failbit upon conversion error.  If the error was due to
493     overflow, store +-numeric_limits&lt;T&gt;::max() as an
494     overflow indication.</li>
495 </ol>
496
497 <p>Straw poll: (1) 5; (2) 0; (3) 8.</p>
498
499
500 <p><b>Proposed resolution:</b></p>
501
502 <p>Discussed at Lillehammer.  General outline of what we want the
503   solution to look like: we want to say that overflow is an error, and
504   provide a way to distinguish overflow from other kinds of errors.
505   Choose candidate field the same way scanf does, but don't describe
506   the rest of the process in terms of format.  If a finite input field
507   is too large (positive or negative) to be represented as a finite
508   value, then set failbit and assign the nearest representable value.
509   Bill will provide wording.</p>
510
511 <hr>
512 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.bool"> [lib.vector.bool]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;AFNOR&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
513 <p><tt>vector&lt;bool&gt;</tt> is not a container as its reference and
514 pointer types are not references and pointers. </p>
515
516 <p>Also it forces everyone to have a space optimization instead of a
517 speed one.</p>
518
519 <p><b>See also:</b> 99-0008 == N1185 Vector&lt;bool&gt; is
520 Nonconforming, Forces Optimization Choice.</p>
521 <p><b>Proposed resolution:</b></p>
522
523 <p><i>[In Santa Cruz the LWG felt that this was Not A Defect.]</i></p>
524
525 <p><i>[In Dublin many present felt that failure to meet Container
526 requirements was a defect. There was disagreement as to whether
527 or not the optimization requirements constituted a defect.]</i></p>
528
529 <p><i>[The LWG looked at the following resolutions in some detail:
530 <br>
531 &nbsp;&nbsp;&nbsp;&nbsp; * Not A Defect.<br>
532 &nbsp;&nbsp;&nbsp;&nbsp; * Add a note explaining that vector&lt;bool&gt; does not meet
533 Container requirements.<br>
534 &nbsp;&nbsp;&nbsp;&nbsp; * Remove vector&lt;bool&gt;.<br>
535 &nbsp;&nbsp;&nbsp;&nbsp; * Add a new category of container requirements which
536 vector&lt;bool&gt; would meet.<br>
537 &nbsp;&nbsp;&nbsp;&nbsp; * Rename vector&lt;bool&gt;.<br>
538 <br>
539 No alternative had strong, wide-spread, support and every alternative
540 had at least one "over my dead body" response.<br>
541 <br>
542 There was also mention of a transition scheme something like (1) add
543 vector_bool and deprecate vector&lt;bool&gt; in the next standard. (2)
544 Remove vector&lt;bool&gt; in the following standard.]</i></p>
545
546 <p><i>[Modifying container requirements to permit returning proxies
547 (thus allowing container requirements conforming vector&lt;bool&gt;)
548 was also discussed.]</i></p>
549
550 <p><i>[It was also noted that there is a partial but ugly workaround in
551 that vector&lt;bool&gt; may be further specialized with a customer
552 allocator.]</i></p>
553
554 <p><i>[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211,
555 vector&lt;bool&gt;: More Problems, Better Solutions. Much discussion
556 of a two step approach: a) deprecate, b) provide replacement under a
557 new name.  LWG straw vote on that: 1-favor, 11-could live with, 2-over
558 my dead body.  This resolution was mentioned in the LWG report to the
559 full committee, where several additional committee members indicated
560 over-my-dead-body positions.]</i></p>
561
562 <p>Discussed at Lillehammer.  General agreement that we should
563   deprecate vector&lt;bool&gt; and introduce this functionality under
564   a different name, e.g. bit_vector.  This might make it possible to
565   remove the vector&lt;bool&gt; specialization in the standard that comes
566   after C++0x. There was also a suggestion that
567   in C++0x we could additional say that it's implementation defined
568   whether vector&lt;bool&gt; refers to the specialization or to the
569   primary template, but there wasn't general agreement that this was a
570   good idea.</p>
571
572 <p>We need a paper for the new bit_vector class.</p>
573
574 <hr>
575 <a name="201"><h3>201.&nbsp;Numeric limits terminology wrong</h3></a><p><b>Section:</b>&nbsp;18.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.limits"> [lib.limits]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Stephen Cleary&nbsp; <b>Date:</b>&nbsp;21 Dec 1999</p>
576 <p>
577 In some places in this section, the terms "fundamental types" and
578 "scalar types" are used when the term "arithmetic types" is intended.
579 The current usage is incorrect because void is a fundamental type and
580 pointers are scalar types, neither of which should have
581 specializations of numeric_limits.
582 </p>
583 <p><b>Proposed resolution:</b></p>
584 <p><i>[Lillehammer: it remains true that numeric_limits is using
585   imprecise language. However, none of the proposals for changed
586   wording are clearer.  A redesign of numeric_limits is needed, but this
587   is more a task than an open issue.]</i></p>
588 <hr>
589 <a name="233"><h3>233.&nbsp;Insertion hints in associative containers</h3></a><p><b>Section:</b>&nbsp;23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;30 Apr 2000</p>
590 <p>
591 If <tt>mm</tt> is a multimap and <tt>p</tt> is an iterator
592 into the multimap, then <tt>mm.insert(p, x)</tt> inserts
593 <tt>x</tt> into <tt>mm</tt> with <tt>p</tt> as a hint as
594 to where it should go.  Table 69 claims that the execution time is
595 amortized constant if the insert winds up taking place adjacent to
596 <tt>p</tt>, but does not say when, if ever, this is guaranteed to
597 happen.  All it says it that <tt>p</tt> is a hint as to where to
598 insert.
599 </p>
600 <p>
601 The question is whether there is any guarantee about the relationship
602 between <tt>p</tt> and the insertion point, and, if so, what it
603 is.
604 </p>
605 <p>
606 I believe the present state is that there is no guarantee: The user
607 can supply <tt>p</tt>, and the implementation is allowed to
608 disregard it entirely.
609 </p>
610
611 <p><b>Additional comments from Nathan:</b><br>
612
613 The vote [in Redmond] was on whether to elaborately specify the use of
614 the hint, or to require behavior only if the value could be inserted
615 adjacent to the hint.  I would like to ensure that we have a chance to
616 vote for a deterministic treatment: "before, if possible, otherwise
617 after, otherwise anywhere appropriate", as an alternative to the
618 proposed "before or after, if possible, otherwise [...]".
619 </p>
620
621
622 <p><b>Proposed resolution:</b></p>
623
624 <p>In table 69 "Associative Container Requirements" in 23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a>, in the row for <tt>a.insert(p, t)</tt>,
625 change</p>
626
627 <blockquote>
628 iterator p is a hint pointing to where the insert
629 should start to search.
630 </blockquote>
631
632 <p>to</p>
633
634 <blockquote>
635 insertion adjacent to iterator p is preferred if
636 more than one insertion point is valid.
637 </blockquote>
638
639 <p>and change</p>
640
641 <blockquote>
642 logarithmic in general, but amortized constant if
643 t is inserted right after p.
644 </blockquote>
645
646 <p>to</p>
647
648 <blockquote>
649 logarithmic in general, but amortized constant if
650 t is inserted adjacent to iterator p.
651 </blockquote>
652
653 <p><i>[Toronto: there was general agreement that this is a real defect:
654 when inserting an element x into a multiset that already contains
655 several copies of x, there is no way to know whether the hint will be
656 used.  The proposed resolution was that the new element should always
657 be inserted as close to the hint as possible.  So, for example, if
658 there is a subsequence of equivalent values, then providing a.begin()
659 as the hint means that the new element should be inserted before the
660 subsequence even if a.begin() is far away.  JC van Winkel supplied
661 precise wording for this proposed resolution, and also for an
662 alternative resolution in which hints are only used when they are
663 adjacent to the insertion point.]</i></p>
664
665 <p><i>[Copenhagen: the LWG agreed to the original proposed resolution,
666 in which an insertion hint would be used even when it is far from the
667 insertion point.  This was contingent on seeing a reference
668 implementation showing that it is possible to implement this
669 requirement without loss of efficiency.  John Potter provided such a
670 reference implementation.]</i></p>
671
672 <p><i>[Redmond: The LWG was reluctant to adopt the proposal that
673 emerged from Copenhagen: it seemed excessively complicated, and went
674 beyond fixing the defect that we identified in Toronto.  PJP provided
675 the new wording described in this issue.  Nathan agrees that we
676 shouldn't adopt the more detailed semantics, and notes: "we know that
677 you can do it efficiently enough with a red-black tree, but there are
678 other (perhaps better) balanced tree techniques that might differ
679 enough to make the detailed semantics hard to satisfy."]</i></p>
680
681 <p><i>[Curaçao: Nathan should give us the alternative wording he
682 suggests so the LWG can decide between the two options.]</i></p>
683
684 <p><i>[Lillehammer: The LWG previously rejected the more detailed
685   semantics, because it seemed more loike a new feature than like
686   defect fixing.  We're now more sympathetic to it, but we (especially
687   Bill) are still worried about performance.  N1780 describes a naive
688   algorithm, but it's not clear whether there is a non-naive
689   implementation. Is it possible to implement this as efficently as
690   the current version of insert?]</i></p>
691
692 <p><i>[Post Lillehammer:  N1780 updated in post meeting mailing with
693 feedback from Lillehammer with more information regarding performance.
694 ]</i></p>
695
696 <hr>
697 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.modifiers"> [lib.vector.modifiers]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Lisa Lippincott&nbsp; <b>Date:</b>&nbsp;06 June 2000</p>
698 <p>Paragraph 2 of 23.2.4.3 [lib.vector.modifiers] describes the complexity
699 of <tt>vector::insert</tt>:</p>
700
701    <blockquote>
702    Complexity: If first and last are forward iterators, bidirectional
703    iterators, or random access iterators, the complexity is linear in
704    the number of elements in the range [first, last) plus the distance
705    to the end of the vector. If they are input iterators, the complexity
706    is proportional to the number of elements in the range [first, last)
707    times the distance to the end of the vector.
708    </blockquote>
709
710 <p>First, this fails to address the non-iterator forms of
711 <tt>insert</tt>.</p>
712
713 <p>Second, the complexity for input iterators misses an edge case --
714 it requires that an arbitrary number of elements can be added at
715 the end of a <tt>vector</tt> in constant time.</p>
716
717 <p>I looked to see if <tt>deque</tt> had a similar problem, and was
718 surprised to find that <tt>deque</tt> places no requirement on the
719 complexity of inserting multiple elements (23.2.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.deque.modifiers"> [lib.deque.modifiers]</a>,
720 paragraph 3):</p>
721
722    <blockquote>
723    Complexity: In the worst case, inserting a single element into a
724    deque takes time linear in the minimum of the distance from the
725    insertion point to the beginning of the deque and the distance
726    from the insertion point to the end of the deque. Inserting a
727    single element either at the beginning or end of a deque always
728    takes constant time and causes a single call to the copy constructor
729    of T.
730    </blockquote>
731 <p><b>Proposed resolution:</b></p>
732
733 <p>Change Paragraph 2 of 23.2.4.3 [lib.vector.modifiers] to</p>
734    <blockquote>
735    Complexity: The complexity is linear in the number of elements 
736    inserted plus the distance to the end of the vector.
737    </blockquote>
738
739    <p><i>[For input iterators, one may achieve this complexity by first
740    inserting at the end of the <tt>vector</tt>, and then using
741    <tt>rotate</tt>.]</i></p>
742
743 <p>Change 23.2.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.deque.modifiers"> [lib.deque.modifiers]</a>, paragraph 3, to:</p>
744
745    <blockquote>
746    Complexity: The complexity is linear in the number of elements 
747    inserted plus the shorter of the distances to the beginning and
748    end of the deque.  Inserting a single element at either the
749    beginning or the end of a deque causes a single call to the copy
750    constructor of T.
751    </blockquote>
752
753 <p><b>Rationale:</b></p>
754 <p>This is a real defect, and proposed resolution fixes it: some
755   complexities aren't specified that should be.  This proposed
756   resolution does constrain deque implementations (it rules out the
757   most naive possible implementations), but the LWG doesn't see a
758   reason to permit that implementation.</p>
759 <hr>
760 <a name="254"><h3>254.&nbsp;Exception types in clause 19 are constructed from <tt>std::string</tt>
761 </h3></a><p><b>Section:</b>&nbsp;19.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-diagnostics.html#lib.std.exceptions"> [lib.std.exceptions]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;01 Aug 2000</p>
762 <p>
763 Many of the standard exception types which implementations are
764 required to throw are constructed with a const std::string&amp;
765 parameter. For example:
766 </p>
767
768 <pre>     19.1.5  Class out_of_range                          [lib.out.of.range]
769      namespace std {
770        class out_of_range : public logic_error {
771        public:
772          explicit out_of_range(const string&amp; what_arg);
773        };
774      }
775
776    1 The class out_of_range defines the type of objects  thrown  as  excep-
777      tions to report an argument value not in its expected range.
778
779      out_of_range(const string&amp; what_arg);
780
781      Effects:
782        Constructs an object of class out_of_range.
783      Postcondition:
784        strcmp(what(), what_arg.c_str()) == 0.
785 </pre>
786
787 <p>
788 There are at least two problems with this:
789 </p>
790 <ol>
791 <li>A program which is low on memory may end up throwing
792 std::bad_alloc instead of out_of_range because memory runs out while
793 constructing the exception object.</li>
794 <li>An obvious implementation which stores a std::string data member
795 may end up invoking terminate() during exception unwinding because the
796 exception object allocates memory (or rather fails to) as it is being
797 copied.</li>
798 </ol>
799
800 <p>
801 There may be no cure for (1) other than changing the interface to
802 out_of_range, though one could reasonably argue that (1) is not a
803 defect. Personally I don't care that much if out-of-memory is reported
804 when I only have 20 bytes left, in the case when out_of_range would
805 have been reported. People who use exception-specifications might care
806 a lot, though.
807 </p>
808
809 <p>
810 There is a cure for (2), but it isn't completely obvious. I think a
811 note for implementors should be made in the standard. Avoiding
812 possible termination in this case shouldn't be left up to chance.  The
813 cure is to use a reference-counted "string" implementation
814 in the exception object. I am not necessarily referring to a
815 std::string here; any simple reference-counting scheme for a NTBS
816 would do.
817 </p>
818
819 <p><b>Further discussion, in email:</b></p>
820
821 <p>
822 ...I'm not so concerned about (1). After all, a library implementation
823 can add const char* constructors as an extension, and users don't
824 <i>need</i> to avail themselves of the standard exceptions, though this is
825 a lame position to be forced into.  FWIW, std::exception and
826 std::bad_alloc don't require a temporary basic_string.
827 </p>
828
829 <p>
830 ...I don't think the fixed-size buffer is a solution to the problem,
831 strictly speaking, because you can't satisfy the postcondition
832 <br>
833     <tt>&nbsp;&nbsp;strcmp(what(), what_arg.c_str()) == 0</tt>
834 <br>
835 For all values of what_arg (i.e. very long values). That means that
836 the only truly conforming solution requires a dynamic allocation.
837 </p>
838
839 <p><b>Further discussion, from Redmond:</b></p>
840
841 <p>The most important progress we made at the Redmond meeting was
842 realizing that there are two separable issues here: the const
843 string&amp; constructor, and the copy constructor.  If a user writes
844 something like <tt>throw std::out_of_range("foo")</tt>, the const
845 string&amp; constructor is invoked before anything gets thrown.  The
846 copy constructor is potentially invoked during stack unwinding.</p>
847
848 <p>The copy constructor is a more serious problem, becuase failure
849 during stack unwinding invokes <tt>terminate</tt>.  The copy
850 constructor must be nothrow. <i>Curaçao: Howard thinks this
851 requirement may already be present.</i></p>
852
853 <p>The fundamental problem is that it's difficult to get the nothrow
854 requirement to work well with the requirement that the exception
855 objects store a string of unbounded size, particularly if you also try
856 to make the const string&amp; constructor nothrow.  Options discussed
857 include:</p>
858
859 <ul>
860 <li>Limit the size of a string that exception objects are required to
861 throw: change the postconditions of 19.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-diagnostics.html#lib.domain.error"> [lib.domain.error]</a> paragraph 3
862 and 19.1.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-diagnostics.html#lib.runtime.error"> [lib.runtime.error]</a> paragraph 3 to something like this:
863 "strncmp(what(), what_arg._str(), N) == 0, where N is an
864 implementation defined constant no smaller than 256".</li>
865 <li>Allow the const string&amp; constructor to throw, but not the
866 copy constructor.  It's the implementor's responsibility to get it
867 right.  (An implementor might use a simple refcount class.)</li>
868 <li>Compromise between the two: an implementation is not allowed to
869 throw if the string's length is less than some N, but, if it doesn't
870 throw, the string must compare equal to the argument.</li>
871 <li>Add a new constructor that takes a const char*</li>
872 </ul>
873
874 <p>(Not all of these options are mutually exclusive.)</p>
875
876 <p><b>Proposed resolution:</b></p>
877 <p><b>Rationale:</b></p>
878
879 <p>Throwing a bad_alloc while trying to construct a message for another
880 exception-derived class is not necessarily a bad thing.  And the
881 bad_alloc constructor already has a no throw spec on it (18.4.2.1).</p>
882
883 <p><b>Future:</b></p>
884
885 <p>All involved would like to see const char* constructors added, but
886 this should probably be done for C++0X as opposed to a DR.</p>
887
888 <p>I believe the no throw specs currently decorating these functions
889 could be improved by some kind of static no throw spec checking
890 mechanism (in a future C++ language).  As they stand, the copy
891 constructors might fail via a call to unexpected.  I think what is
892 intended here is that the copy constructors can't fail.</p>
893
894 <p><i>[Pre-Sydney: reopened at the request of Howard Hinnant.
895   Post-Redmond: James Kanze noticed that the copy constructors of
896   exception-derived classes do not have nothrow clauses.  Those
897   classes have no copy constructors declared, meaning the
898   compiler-generated implicit copy constructors are used, and those
899   compiler-generated constructors might in principle throw anything.]</i></p>
900
901 <hr>
902 <a name="258"><h3>258.&nbsp;Missing allocator requirement</h3></a><p><b>Section:</b>&nbsp;20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;22 Aug 2000</p>
903 <p>
904 &gt;From lib-7752:
905 </p>
906
907 <p>
908 I've been assuming (and probably everyone else has been assuming) that
909 allocator instances have a particular property, and I don't think that
910 property can be deduced from anything in Table 32.
911 </p>
912
913 <p>
914 I think we have to assume that allocator type conversion is a
915 homomorphism.  That is, if x1 and x2 are of type X, where
916 X::value_type is T, and if type Y is X::template
917 rebind&lt;U&gt;::other, then Y(x1) == Y(x2) if and only if x1 == x2.
918 </p>
919
920 <p>
921 Further discussion: Howard Hinnant writes, in lib-7757:
922 </p>
923
924 <p>
925 I think I can prove that this is not provable by Table 32.  And I agree 
926 it needs to be true except for the "and only if".  If x1 != x2, I see no 
927 reason why it can't be true that Y(x1) == Y(x2).  Admittedly I can't 
928 think of a practical instance where this would happen, or be valuable.  
929 But I also don't see a need to add that extra restriction.  I think we 
930 only need:
931 </p>
932
933 <blockquote>
934      if (x1 == x2) then Y(x1) == Y(x2)
935 </blockquote>
936
937 <p>
938 If we decide that == on allocators is transitive, then I think I can 
939 prove the above.  But I don't think == is necessarily transitive on 
940 allocators.  That is:
941 </p>
942
943 <p>
944 Given x1 == x2  and x2 == x3, this does not mean x1 == x3.
945 </p>
946
947 <p>Example:</p>
948
949 <blockquote>
950 <p>
951 x1 can deallocate pointers from:  x1, x2, x3    <br>
952 x2 can deallocate pointers from:  x1, x2, x4    <br>
953 x3 can deallocate pointers from:  x1, x3        <br>
954 x4 can deallocate pointers from:  x2, x4 
955 </p>
956
957 <p>
958 x1 == x2, and x2 == x4, but x1 != x4
959 </p>
960 </blockquote>
961 <p><b>Proposed resolution:</b></p>
962
963 <p><i>[Toronto: LWG members offered multiple opinions.  One
964 opinion is that it should not be required that <tt>x1 == x2</tt>
965 implies <tt>Y(x1) == Y(x2)</tt>, and that it should not even be
966 required that <tt>X(x1) == x1</tt>.  Another opinion is that 
967 the second line from the bottom in table 32 already implies the
968 desired property.  This issue should be considered in light of
969 other issues related to allocator instances.]</i></p>
970 <hr>
971 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.foreach"> [lib.alg.foreach]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;03 Jan 2001</p>
972 <p>The specification of the for_each algorithm does not have a
973 "Requires" section, which means that there are no
974 restrictions imposed on the function object whatsoever. In essence it
975 means that I can provide any function object with arbitrary side
976 effects and I can still expect a predictable result. In particular I
977 can expect that the function object is applied exactly last - first
978 times, which is promised in the "Complexity" section.
979 </p>
980
981 <p>I don't see how any implementation can give such a guarantee
982 without imposing requirements on the function object.
983 </p>
984
985 <p>Just as an example: consider a function object that removes
986 elements from the input sequence.  In that case, what does the
987 complexity guarantee (applies f exactly last - first times) mean?
988 </p>
989
990 <p>One can argue that this is obviously a nonsensical application and
991 a theoretical case, which unfortunately it isn't.  I have seen
992 programmers shooting themselves in the foot this way, and they did not
993 understand that there are restrictions even if the description of the
994 algorithm does not say so.
995 </p>
996 <p><b>Proposed resolution:</b></p>
997 <p><i>[Lillehammer: This is more general than for_each.  We don't want
998   the function object in transform invalidiating iterators
999   either. There should be a note somewhere in clause 17 (17, not 25)
1000   saying that user code operating on a range may not invalidate
1001   iterators unless otherwise specified.  Bill will provide wording.]</i></p>
1002
1003 <hr>
1004 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.macro.names"> [lib.macro.names]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;James Kanze&nbsp; <b>Date:</b>&nbsp;11 Jan 2001</p>
1005 <p>Paragraph 2 of 17.4.3.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.macro.names"> [lib.macro.names]</a> reads: "A
1006 translation unit that includes a header shall not contain any macros
1007 that define names declared in that header." As I read this, it
1008 would mean that the following program is legal:</p>
1009
1010 <pre>  #define npos 3.14
1011   #include &lt;sstream&gt;
1012 </pre>
1013
1014 <p>since npos is not defined in &lt;sstream&gt;.  It is, however, defined
1015 in &lt;string&gt;, and it is hard to imagine an implementation in
1016 which &lt;sstream&gt; didn't include &lt;string&gt;.</p>
1017
1018 <p>I think that this phrase was probably formulated before it was
1019 decided that a standard header may freely include other standard
1020 headers.  The phrase would be perfectly appropriate for C, for
1021 example.  In light of 17.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.headers"> [lib.res.on.headers]</a> paragraph 1, however,
1022 it isn't stringent enough.</p>
1023 <p><b>Proposed resolution:</b></p>
1024 <p>For 17.4.3.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.macro.names"> [lib.macro.names]</a>, replace the current wording, which reads:</p>
1025 <blockquote>
1026      <p>Each name defined as a macro in a header is reserved to the
1027      implementation for any use if the translation unit includes
1028      the header.168)</p>
1029
1030      <p>A translation unit that includes a header shall not contain any
1031      macros that define names declared or defined in that header. Nor shall
1032      such a translation unit define macros for names lexically
1033      identical to keywords.</p>
1034
1035      <p>168) It is not permissible to remove a library macro definition by
1036      using the #undef directive.</p>
1037 </blockquote>
1038
1039 <p>with the wording:</p>
1040
1041 <blockquote>
1042      <p>A translation unit that includes a standard library header shall not
1043      #define or #undef names declared in any standard library header.</p>
1044
1045      <p>A translation unit shall not #define or #undef names lexically
1046      identical to keywords.</p>
1047 </blockquote>
1048
1049 <p><i>[Lillehammer: Beman provided new wording]</i></p>
1050
1051 <hr>
1052 <a name="299"><h3>299.&nbsp;Incorrect return types for iterator dereference</h3></a><p><b>Section:</b>&nbsp;24.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.bidirectional.iterators"> [lib.bidirectional.iterators]</a>, 24.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.random.access.iterators"> [lib.random.access.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;John Potter&nbsp; <b>Date:</b>&nbsp;22 Jan 2001</p>
1053 <p>
1054 In section 24.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.bidirectional.iterators"> [lib.bidirectional.iterators]</a>,
1055 Table 75 gives the return type of *r-- as convertible to T.  This is
1056 not consistent with Table 74 which gives the return type of *r++ as
1057 T&amp;.  *r++ = t is valid while *r-- = t is invalid.
1058 </p>
1059
1060 <p>
1061 In section 24.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.random.access.iterators"> [lib.random.access.iterators]</a>,
1062 Table 76 gives the return type of a[n] as convertible to T.  This is
1063 not consistent with the semantics of *(a + n) which returns T&amp; by
1064 Table 74.  *(a + n) = t is valid while a[n] = t is invalid.
1065 </p>
1066
1067 <p>
1068 Discussion from the Copenhagen meeting: the first part is
1069 uncontroversial.  The second part, operator[] for Random Access
1070 Iterators, requires more thought.  There are reasonable arguments on
1071 both sides.  Return by value from operator[] enables some potentially
1072 useful iterators, e.g. a random access "iota iterator" (a.k.a
1073 "counting iterator" or "int iterator").  There isn't any obvious way
1074 to do this with return-by-reference, since the reference would be to a
1075 temporary.  On the other hand, <tt>reverse_iterator</tt> takes an
1076 arbitrary Random Access Iterator as template argument, and its
1077 operator[] returns by reference.  If we decided that the return type
1078 in Table 76 was correct, we would have to change
1079 <tt>reverse_iterator</tt>.  This change would probably affect user
1080 code.
1081 </p>
1082
1083 <p>
1084 History: the contradiction between <tt>reverse_iterator</tt> and the
1085 Random Access Iterator requirements has been present from an early
1086 stage.  In both the STL proposal adopted by the committee
1087 (N0527==94-0140) and the STL technical report (HPL-95-11 (R.1), by
1088 Stepanov and Lee), the Random Access Iterator requirements say that
1089 operator[]'s return value is "convertible to T".  In N0527
1090 reverse_iterator's operator[] returns by value, but in HPL-95-11
1091 (R.1), and in the STL implementation that HP released to the public,
1092 reverse_iterator's operator[] returns by reference.  In 1995, the
1093 standard was amended to reflect the contents of HPL-95-11 (R.1).  The
1094 original intent for operator[] is unclear.
1095 </p>
1096
1097 <p>
1098 In the long term it may be desirable to add more fine-grained 
1099 iterator requirements, so that access method and traversal strategy
1100 can be decoupled.  (See "Improved Iterator Categories and
1101 Requirements", N1297 = 01-0011, by Jeremy Siek.)  Any decisions
1102 about issue 299 should keep this possibility in mind.
1103 </p>
1104
1105 <p>Further discussion: I propose a compromise between John Potter's
1106 resolution, which requires <tt>T&amp;</tt> as the return type of
1107 <tt>a[n]</tt>, and the current wording, which requires convertible to
1108 <tt>T</tt>. The compromise is to keep the convertible to <tt>T</tt>
1109 for the return type of the expression <tt>a[n]</tt>, but to also add
1110 <tt>a[n] = t</tt> as a valid expression. This compromise "saves" the
1111 common case uses of random access iterators, while at the same time
1112 allowing iterators such as counting iterator and caching file
1113 iterators to remain random access iterators (iterators where the
1114 lifetime of the object returned by <tt>operator*()</tt> is tied to the
1115 lifetime of the iterator).
1116 </p>
1117
1118 <p>
1119 Note that the compromise resolution necessitates a change to
1120 <tt>reverse_iterator</tt>. It would need to use a proxy to support
1121 <tt>a[n] = t</tt>.
1122 </p>
1123
1124 <p>
1125 Note also there is one kind of mutable random access iterator that
1126 will no longer meet the new requirements. Currently, iterators that
1127 return an r-value from <tt>operator[]</tt> meet the requirements for a
1128 mutable random access iterartor, even though the expression <tt>a[n] =
1129 t</tt> will only modify a temporary that goes away. With this proposed
1130 resolution, <tt>a[n] = t</tt> will be required to have the same
1131 operational semantics as <tt>*(a + n) = t</tt>.
1132 </p>
1133
1134 <p><b>Proposed resolution:</b></p>
1135
1136 <p>
1137 In section 24.1.4 [lib.bidirectdional.iterators], change the return
1138 type in table 75 from "convertible to <tt>T</tt>" to
1139 <tt>T&amp;</tt>.
1140 </p>
1141
1142 <p>
1143 In section 24.1.5 [lib.random.access.iterators], change the
1144 operational semantics for <tt>a[n]</tt> to " the r-value of
1145 <tt>a[n]</tt> is equivalent to the r-value of <tt>*(a +
1146 n)</tt>". Add a new row in the table for the expression <tt>a[n] = t</tt>
1147 with a return type of convertible to <tt>T</tt> and operational semantics of
1148 <tt>*(a + n) = t</tt>.
1149 </p>
1150
1151 <p><i>[Lillehammer: Real problem, but should be addressed as part of
1152   iterator redesign]</i></p>
1153
1154 <hr>
1155 <a name="342"><h3>342.&nbsp;seek and eofbit</h3></a><p><b>Section:</b>&nbsp;27.6.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.unformatted"> [lib.istream.unformatted]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;09 Oct 2001</p>
1156 <p>I think we have a defect.</p>
1157
1158 <p>According to lwg issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#60">60</a> which is now a dr, the
1159 description of seekg in 27.6.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.unformatted"> [lib.istream.unformatted]</a> paragraph 38 now looks
1160 like:</p>
1161
1162 <blockquote>
1163 Behaves as an unformatted input function (as described in 27.6.1.3, 
1164 paragraph 1), except that it does not count the number of characters 
1165 extracted and does not affect the value returned by subsequent calls to 
1166 gcount(). After constructing a sentry object, if fail() != true, 
1167 executes rdbuf()­&gt;pubseekpos( pos).
1168 </blockquote>
1169
1170 <p>And according to lwg issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#243">243</a> which is also now a dr,
1171 27.6.1.3, paragraph 1 looks like:</p>
1172
1173 <blockquote>
1174 Each unformatted input function begins execution by constructing an 
1175 object of class sentry with the default argument noskipws (second) 
1176 argument true. If the sentry object returns true, when converted to a 
1177 value of type bool, the function endeavors to obtain the requested 
1178 input.  Otherwise, if the sentry constructor exits by throwing an 
1179 exception or if the sentry object returns false, when converted to a 
1180 value of type bool, the function returns without attempting to obtain 
1181 any input. In either case the number of extracted characters is set to 
1182 0; unformatted input functions taking a character array of non-zero 
1183 size as an argument shall also store a null character (using charT()) 
1184 in the first location of the array. If an exception is thrown during 
1185 input then ios::badbit is turned on in *this'ss error state. If 
1186 (exception()&amp;badbit)!= 0 then the exception is rethrown. It also counts 
1187 the number of characters extracted. If no exception has been thrown it 
1188 ends by storing the count in a member object and returning the value 
1189 specified. In any event the sentry object is destroyed before leaving 
1190 the unformatted input function.
1191 </blockquote>
1192
1193 <p>And finally 27.6.1.1.2/5 says this about sentry:</p>
1194
1195 <blockquote>
1196 If, after any preparation is completed, is.good() is true, ok_ != false 
1197 otherwise, ok_ == false.
1198 </blockquote>
1199
1200 <p>
1201 So although the seekg paragraph says that the operation proceeds if 
1202 !fail(), the behavior of unformatted functions says the operation 
1203 proceeds only if good().  The two statements are contradictory when only 
1204 eofbit is set.  I don't think the current text is clear which condition 
1205 should be respected.
1206 </p>
1207
1208 <p><b>Further discussion from Redmond:</b></p>
1209
1210 <p>PJP: It doesn't seem quite right to say that <tt>seekg</tt> is
1211 "unformatted". That makes specific claims about sentry that
1212 aren't quite appropriate for seeking, which has less fragile failure
1213 modes than actual input.  If we do really mean that it's unformatted
1214 input, it should behave the same way as other unformatted input.  On
1215 the other hand, "principle of least surprise" is that seeking from EOF
1216 ought to be OK.</p>
1217 <p><b>Proposed resolution:</b></p>
1218
1219 <p>Change 27.6.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.unformatted"> [lib.istream.unformatted]</a> to:</p>
1220 <blockquote>
1221 Behaves as an unformatted input function (as described in 27.6.1.3,
1222 paragraph 1), except that it does not count the number of characters
1223 extracted, does not affect the value returned by subsequent calls to
1224 gcount(), and does not examine the value returned by the sentry
1225 object. After constructing a sentry object, if <tt>fail() !=
1226 true</tt>, executes <tt>rdbuf()-&gt;pubseekpos(pos)</tt>.  In
1227 case of success, the function calls clear().
1228 In case of failure, the function calls <tt>setstate(failbit)</tt>
1229 (which may throw <tt>ios_base::failure</tt>).
1230 </blockquote>
1231
1232 <p><i>[Lillehammer: Matt provided wording.]</i></p>
1233
1234 <p><b>Rationale:</b></p>
1235 <p>In C, fseek does clear EOF.  This is probably what most users would
1236   expect.  We agree that having eofbit set should not deter a seek,
1237   and that a successful seek should clear eofbit. Note
1238   that <tt>fail()</tt> is true only if <tt>failbit</tt>
1239   or <tt>badbit</tt> is set, so using <tt>!fail()</tt>, rather
1240   than <tt>good()</tt>, satisfies this goal.</p>
1241 <hr>
1242 <a name="362"><h3>362.&nbsp;bind1st/bind2nd type safety</h3></a><p><b>Section:</b>&nbsp;20.3.6.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.bind.1st"> [lib.bind.1st]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Demkin&nbsp; <b>Date:</b>&nbsp;26 Apr 2002</p>
1243 <p>
1244 The definition of bind1st() (20.3.6.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.bind.1st"> [lib.bind.1st]</a>) can result in
1245 the construction of an unsafe binding between incompatible pointer
1246 types. For example, given a function whose first parameter type is
1247 'pointer to T', it's possible without error to bind an argument of
1248 type 'pointer to U' when U does not derive from T:
1249 </p>
1250 <pre>   foo(T*, int);
1251
1252    struct T {};
1253    struct U {};
1254
1255    U u;
1256
1257    int* p;
1258    int* q;
1259
1260    for_each(p, q, bind1st(ptr_fun(foo), &amp;u));    // unsafe binding
1261 </pre>
1262
1263 <p>
1264 The definition of bind1st() includes a functional-style conversion to
1265 map its argument to the expected argument type of the bound function
1266 (see below):
1267 </p>
1268 <pre>  typename Operation::first_argument_type(x)
1269 </pre>
1270
1271 <p>
1272 A functional-style conversion (5.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/expr.html#expr.type.conv"> [expr.type.conv]</a>) is defined to be
1273 semantically equivalent to an explicit cast expression (5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/expr.html#expr.cast"> [expr.cast]</a>), which may (according to 5.4, paragraph 5) be interpreted
1274 as a reinterpret_cast, thus masking the error.
1275 </p>
1276
1277 <p>The problem and proposed change also apply to 20.3.6.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.bind.2nd"> [lib.bind.2nd]</a>.</p>
1278 <p><b>Proposed resolution:</b></p>
1279 <p>Add this sentence to the end of 20.3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.binders"> [lib.binders]</a>/1:
1280   "Binders <tt>bind1st</tt> and <tt>bind2nd</tt> are deprecated in
1281   favor of <tt>std::tr1::bind</tt>."</p>
1282
1283 <p>(Notes to editor: (1) when and if tr1::bind is incorporated into
1284   the standard, "std::tr1::bind" should be changed to "std::bind". (2)
1285   20.3.6 should probably be moved to Annex D.</p>
1286 <p><b>Rationale:</b></p>
1287 <p>There is no point in fixing bind1st and bind2nd.  tr1::bind is a
1288   superior solution.  It solves this problem and others.</p>
1289 <hr>
1290 <a name="369"><h3>369.&nbsp;io stream objects and static ctors</h3></a><p><b>Section:</b>&nbsp;27.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostream.objects"> [lib.iostream.objects]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Ruslan Abdikeev&nbsp; <b>Date:</b>&nbsp;8 Jul 2002</p>
1291 <p>
1292 Is it safe to use standard iostream objects from constructors of
1293 static objects?  Are standard iostream objects constructed and are
1294 their associations established at that time?
1295 </p>
1296
1297 <p>Surpisingly enough, Standard does NOT require that.</p>
1298
1299 <p>
1300 27.3/2 [lib.iostream.objects] guarantees that standard iostream
1301 objects are constructed and their associations are established before
1302 the body of main() begins execution.  It also refers to ios_base::Init
1303 class as the panacea for constructors of static objects.
1304 </p>
1305
1306 <p>
1307 However, there's nothing in 27.3 [lib.iostream.objects],
1308 in 27.4.2 [lib.ios.base], and in 27.4.2.1.6 [lib.ios::Init],
1309 that would require implementations to allow access to standard
1310 iostream objects from constructors of static objects.
1311 </p>
1312
1313 <p>Details:</p>
1314
1315 <p>Core text refers to some magic object ios_base::Init, which will
1316 be discussed below:</p>
1317
1318 <blockquote>
1319     "The [standard iostream] objects are constructed, and their
1320     associations are established at some time prior to or during
1321     first time an object of class basic_ios&lt;charT,traits&gt;::Init
1322     is constructed, and in any case before the body of main
1323     begins execution." (27.3/2 [lib.iostream.objects])
1324 </blockquote>
1325
1326 <p>
1327 The first <i>non-normative</i> footnote encourages implementations
1328 to initialize standard iostream objects earlier than required.
1329 </p>
1330
1331 <p>However, the second <i>non-normative</i> footnote makes an explicit
1332 and unsupported claim:</p>
1333
1334 <blockquote>
1335   "Constructors and destructors for static objects can access these
1336   [standard iostream] objects to read input from stdin or write output
1337   to stdout or stderr." (27.3/2 footnote 265 [lib.iostream.objects])
1338 </blockquote>
1339
1340 <p>
1341 The only bit of magic is related to that ios_base::Init class.  AFAIK,
1342 the rationale behind ios_base::Init was to bring an instance of this
1343 class to each translation unit which #included &lt;iostream&gt; or
1344 related header.  Such an inclusion would support the claim of footnote
1345 quoted above, because in order to use some standard iostream object it
1346 is necessary to #include &lt;iostream&gt;.
1347 </p>
1348
1349 <p>
1350 However, while Standard explicitly describes ios_base::Init as
1351 an appropriate class for doing the trick, I failed to found a
1352 mention of an _instance_ of ios_base::Init in Standard.
1353 </p>
1354 <p><b>Proposed resolution:</b></p>
1355
1356 <p>Add to 27.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostream.objects"> [lib.iostream.objects]</a>, p2, immediately before the last sentence
1357 of the paragraph, the following two sentences:</p>
1358
1359 <blockquote>
1360 If a translation unit includes &lt;iostream&gt;, or explicitly
1361 constructs an ios_base::Init object, these stream objects shall
1362 be constructed before dynamic initialization of non-local
1363 objects defined later in that translation unit, and these stream
1364 objects shall be destroyed after the destruction of dynamically
1365 initialized non-local objects defined later in that translation unit.
1366 </blockquote>
1367
1368 <p><i>[Lillehammer: Matt provided wording.]</i></p>
1369 <p><i>[Mont Tremblant: Matt provided revised wording.]</i></p>
1370 <p><b>Rationale:</b></p>
1371 <p>
1372 The original proposed resolution unconditionally required
1373 implementations to define an ios_base::Init object of some
1374 implementation-defined name in the header &lt;iostream&gt;. That's an
1375 overspecification. First, defining the object may be unnecessary
1376 and even detrimental to performance if an implementation can
1377 guarantee that the 8 standard iostream objects will be initialized
1378 before any other user-defined object in a program. Second, there
1379 is no need to require implementations to document the name of the
1380 object.</p>
1381
1382 <p>
1383 The new proposed resolution gives users guidance on what they need to
1384 do to ensure that stream objects are constructed during startup.</p>
1385 <hr>
1386 <a name="371"><h3>371.&nbsp;Stability of multiset and multimap member functions</h3></a><p><b>Section:</b>&nbsp;23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Frank Compagner&nbsp; <b>Date:</b>&nbsp;20 Jul 2002</p>
1387 <p>
1388 The requirements for multiset and multimap containers (23.1
1389 [lib.containers.requirements], 23.1.2 [lib.associative.reqmnts],
1390 23.3.2 [lib.multimap] and 23.3.4 [lib.multiset]) make no mention of
1391 the stability of the required (mutating) member functions. It appears
1392 the standard allows these functions to reorder equivalent elements of
1393 the container at will, yet the pervasive red-black tree implementation
1394 appears to provide stable behaviour.
1395 </p>
1396
1397 <p>This is of most concern when considering the behaviour of erase().
1398 A stability requirement would guarantee the correct working of the
1399 following 'idiom' that removes elements based on a certain predicate
1400 function.
1401 </p>
1402
1403 <pre>  multimap&lt;int, int&gt; m;
1404   multimap&lt;int, int&gt;::iterator i = m.begin();
1405   while (i != m.end()) {
1406       if (pred(i))
1407           m.erase (i++);
1408       else
1409           ++i;
1410   }
1411 </pre>
1412
1413 <p>
1414 Although clause 23.1.2/8 guarantees that i remains a valid iterator
1415 througout this loop, absence of the stability requirement could
1416 potentially result in elements being skipped. This would make
1417 this code incorrect, and, furthermore, means that there is no way
1418 of erasing these elements without iterating first over the entire
1419 container, and second over the elements to be erased. This would
1420 be unfortunate, and have a negative impact on both performance and
1421 code simplicity.
1422 </p>
1423
1424 <p>
1425 If the stability requirement is intended, it should be made explicit
1426 (probably through an extra paragraph in clause 23.1.2).
1427 </p>
1428 <p>
1429 If it turns out stability cannot be guaranteed, i'd argue that a
1430 remark or footnote is called for (also somewhere in clause 23.1.2) to
1431 warn against relying on stable behaviour (as demonstrated by the code
1432 above).  If most implementations will display stable behaviour, any
1433 problems emerging on an implementation without stable behaviour will
1434 be hard to track down by users. This would also make the need for an
1435 erase_if() member function that much greater.
1436 </p>
1437
1438 <p>This issue is somewhat related to LWG issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130">130</a>.</p>
1439
1440 <p><b>Proposed resolution:</b></p>
1441
1442 <p>Add the following to the end of 23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a> paragraph 4: 
1443 "For <tt>multiset</tt> and <tt>multimap</tt>, <tt>insert</tt>and <tt>erase</tt>
1444   are <i>stable</i>: they preserve the relative ordering of equivalent
1445   elements.</p> 
1446
1447 <p><i>[Lillehammer: Matt provided wording]</i></p>
1448 <p><i>[Joe Gottman points out that the provided wording does not address
1449 multimap and multiset.  N1780 also addresses this issue and suggests
1450 wording.]</i></p>
1451
1452 <p><i>[Mont Tremblant: Changed set and map to multiset and multimap.]</i></p>
1453
1454 <p><b>Rationale:</b></p>
1455 <p>The LWG agrees that this guarantee is necessary for common user
1456   idioms to work, and that all existing implementations provide this
1457   property.  Note that this resolution guarantees stability for
1458   multimap and multiset, not for all associative containers in
1459   general.</p>
1460
1461 <hr>
1462 <a name="376"><h3>376.&nbsp;basic_streambuf semantics</h3></a><p><b>Section:</b>&nbsp;27.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringbuf.virtuals"> [lib.stringbuf.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Ray Lischner&nbsp; <b>Date:</b>&nbsp;14 Aug 2002</p>
1463 <p>
1464 In Section 27.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringbuf.virtuals"> [lib.stringbuf.virtuals]</a>, Table 90, the implication is that
1465 the four conditions should be mutually exclusive, but they are not.
1466 The first two cases, as written, are subcases of the third.</p>
1467
1468 <p>
1469 As written, it is unclear what should be the result if cases 1 and 2
1470 are both true, but case 3 is false.
1471 </p>
1472
1473 <p><b>Proposed resolution:</b></p>
1474
1475 <p>Rewrite these conditions as:</p>
1476 <blockquote>
1477 <p>
1478   (which &amp; (ios_base::in|ios_base::out)) == ios_base::in
1479 </p>
1480
1481 <p>
1482   (which &amp; (ios_base::in|ios_base::out)) == ios_base::out
1483 </p>
1484
1485 <p>
1486   (which &amp; (ios_base::in|ios_base::out)) == 
1487 (ios_base::in|ios_base::out)
1488    and way == either ios_base::beg or ios_base::end
1489 </p>
1490
1491 <p>Otherwise</p>
1492 </blockquote>
1493
1494 <p><b>Rationale:</b></p>
1495 <p>It's clear what we wanted to say, we just failed to say it.  This
1496   fixes it.</p>
1497 <hr>
1498 <a name="382"><h3>382.&nbsp;codecvt do_in/out result</h3></a><p><b>Section:</b>&nbsp;22.2.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt"> [lib.locale.codecvt]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;30 Aug  2002</p>
1499 <p>
1500 It seems that the descriptions of codecvt do_in() and do_out() leave
1501 sufficient room for interpretation so that two implementations of
1502 codecvt may not work correctly with the same filebuf. Specifically,
1503 the following seems less than adequately specified:
1504 </p>
1505
1506 <ol>
1507 <li>
1508   the conditions under which the functions terminate
1509 </li>
1510 <li>
1511   precisely when the functions return ok
1512 </li>
1513 <li>
1514   precisely when the functions return partial
1515 </li>
1516 <li>
1517   the full set of conditions when the functions return error
1518 </li>
1519 </ol>
1520
1521 <ol>
1522 <li>
1523    22.2.1.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt.virtuals"> [lib.locale.codecvt.virtuals]</a>, p2 says this about the effects of the
1524    function: ...Stops if it encounters a character it cannot
1525    convert...  This assumes that there *is* a character to
1526    convert. What happens when there is a sequence that doesn't form a
1527    valid source character, such as an unassigned or invalid UNICODE
1528    character, or a sequence that cannot possibly form a character
1529    (e.g., the sequence "\xc0\xff" in UTF-8)?
1530 </li>
1531 <li>
1532    Table 53 says that the function returns codecvt_base::ok
1533    to indicate that the function(s) "completed the conversion."
1534    Suppose that the source sequence is "\xc0\x80" in UTF-8,
1535    with from pointing to '\xc0' and (from_end==from + 1).
1536    It is not clear whether the return value should be ok
1537    or partial (see below).
1538 </li>
1539 <li>
1540    Table 53 says that the function returns codecvt_base::partial
1541    if "not all source characters converted." With the from pointers
1542    set up the same way as above, it is not clear whether the return
1543    value should be partial or ok (see above).
1544 </li>
1545 <li>
1546    Table 53, in the row describing the meaning of error mistakenly
1547    refers to a "from_type" character, without the symbol from_type
1548    having been defined. Most likely, the word "source" character
1549    is intended, although that is not sufficient. The functions
1550    may also fail when they encounter an invalid source sequence
1551    that cannot possibly form a valid source character (e.g., as
1552    explained in bullet 1 above).
1553 </li>
1554 </ol>
1555 <p>
1556 Finally, the conditions described at the end of 22.2.1.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt.virtuals"> [lib.locale.codecvt.virtuals]</a>, p4 don't seem to be possible:
1557 </p>
1558 <blockquote>
1559     "A return value of partial, if (from_next == from_end),
1560     indicates that either the destination sequence has not
1561     absorbed all the available destination elements, or that
1562     additional source elements are needed before another
1563     destination element can be produced."
1564 </blockquote>
1565 <p>
1566 If the value is partial, it's not clear to me that (from_next
1567 ==from_end) could ever hold if there isn't enough room
1568 in the destination buffer. In order for (from_next==from_end) to
1569 hold, all characters in that range must have been successfully
1570 converted (according to 22.2.1.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt.virtuals"> [lib.locale.codecvt.virtuals]</a>, p2) and since there are no
1571 further source characters to convert, no more room in the
1572 destination buffer can be needed.
1573 </p>
1574 <p>
1575 It's also not clear to me that (from_next==from_end) could ever
1576 hold if additional source elements are needed to produce another
1577 destination character (not element as incorrectly stated in the
1578 text). partial is returned if "not all source characters have
1579 been converted" according to Table 53, which also implies that
1580 (from_next==from) does NOT hold.
1581 </p>
1582 <p>
1583 Could it be that the intended qualifying condition was actually
1584 (from_next != from_end), i.e., that the sentence was supposed
1585 to read
1586 </p>
1587 <blockquote>
1588     "A return value of partial, if (from_next != from_end),..."
1589 </blockquote>
1590 <p>
1591 which would make perfect sense, since, as far as I understand it,
1592 partial can only occur if (from_next != from_end)?
1593 </p>
1594 <p><b>Proposed resolution:</b></p>
1595
1596 <p><i>[Lillehammer: Defer for the moment, but this really needs to be
1597   fixed. Right now, the description of codecvt is too vague for it to
1598   be a useful contract between providers and clients of codecvt
1599   facets.  (Note that both vendors and users can be both providers and
1600   clients of codecvt facets.) The major philosophical issue is whether
1601   the standard should only describe mappings that take a single wide
1602   character to multiple narrow characters (and vice versa), or whether
1603   it should describe fully general N-to-M conversions. When the
1604   original standard was written only the former was contemplated, but
1605   today, in light of the popularity of utf8 and utf16, that doesn't
1606   seem sufficient for C++0x. Bill supports general N-to-M conversions;
1607   we need to make sure Martin and Howard agree.]</i></p>
1608
1609 <hr>
1610 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.equal.range"> [lib.equal.range]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Hans Bos&nbsp; <b>Date:</b>&nbsp;18 Oct 2002</p>
1611 <p>
1612 Section 25.3.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.equal.range"> [lib.equal.range]</a>
1613 states that at most 2 * log(last - first) + 1
1614 comparisons are allowed for equal_range.
1615 </p>
1616
1617 <p>It is not possible to implement equal_range with these constraints.</p>
1618
1619 <p>In a range of one element as in:</p>
1620 <pre>    int x = 1;
1621     equal_range(&amp;x, &amp;x + 1, 1)
1622 </pre>
1623
1624 <p>it is easy to see that at least 2 comparison operations are needed.</p>
1625
1626 <p>For this case at most 2 * log(1) + 1 = 1 comparison is allowed.</p>
1627
1628 <p>I have checked a few libraries and they all use the same (nonconforming)
1629 algorithm for equal_range that has a complexity of</p>
1630 <pre>     2* log(distance(first, last)) + 2.
1631 </pre>
1632 <p>I guess this is the algorithm that the standard assumes for equal_range.</p>
1633
1634 <p>
1635 It is easy to see that 2 * log(distance) + 2 comparisons are enough
1636 since equal range can be implemented with lower_bound and upper_bound
1637 (both log(distance) + 1).
1638 </p>
1639
1640 <p>
1641 I think it is better to require something like 2log(distance) + O(1)  (or
1642 even logarithmic as multiset::equal_range).
1643 Then an implementation has more room to optimize for certain cases (e.g.
1644 have log(distance) characteristics when at most match is found in the range
1645 but 2log(distance) + 4 for the worst case).
1646 </p>
1647
1648 <p><b>Proposed resolution:</b></p>
1649 <p>In 25.3.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.lower.bound"> [lib.lower.bound]</a>/4, change <tt>log(last - first) + 1</tt>
1650 to <tt>log<sub>2</sub>(last - first) + <i>O</i>(1)</tt>.</p>
1651
1652 <p>In 25.3.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.upper.bound"> [lib.upper.bound]</a>/4, change <tt>log(last - first) + 1</tt>
1653 to <tt>log<sub>2</sub>(last - first) + <i>O</i>(1)</tt>.</p>
1654
1655 <p>In 25.3.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.equal.range"> [lib.equal.range]</a>/4, change <tt>2*log(last - first) + 1</tt>
1656 to <tt>2*log<sub>2</sub>(last - first) + <i>O</i>(1)</tt>.</p>
1657
1658 <p><i>[Matt provided wording]</i></p>
1659 <p><b>Rationale:</b></p>
1660 <p>The LWG considered just saying <i>O</i>(log n) for all three, but
1661 Ê decided that threw away too much valuable information.Ê The fact
1662 Ê that lower_bound is twice as fast as equal_range is important.
1663 Ê However, it's better to allow an arbitrary additive constant than to
1664 Ê specify an exact count.Ê An exact count would have to
1665 Ê involve <tt>floor</tt> or <tt>ceil</tt>.Ê It would be too easy to
1666 Ê get this wrong, and don't provide any substantial value for users.</p>
1667 <hr>
1668 <a name="385"><h3>385.&nbsp;Does call by value imply the CopyConstructible requirement?</h3></a><p><b>Section:</b>&nbsp;17 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.library"> [lib.library]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;23 Oct 2002</p>
1669 <p>
1670 Many function templates have parameters that are passed by value;
1671 a typical example is <tt>find_if</tt>'s <i>pred</i> parameter in
1672 25.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.find"> [lib.alg.find]</a>.  Are the corresponding template parameters
1673 (<tt>Predicate</tt> in this case) implicitly required to be
1674 CopyConstructible, or does that need to be spelled out explicitly?
1675 </p>
1676
1677 <p>
1678 This isn't quite as silly a question as it might seem to be at first
1679 sight.  If you call <tt>find_if</tt> in such a way that template
1680 argument deduction applies, then of course you'll get call by value
1681 and you need to provide a copy constructor.  If you explicitly provide
1682 the template arguments, however, you can force call by reference by
1683 writing something like <tt>find_if&lt;my_iterator,
1684 my_predicate&amp;&gt;</tt>.  The question is whether implementation
1685 are required to accept this, or whether this is ill-formed because
1686 my_predicate&amp; is not CopyConstructible.
1687 </p>
1688
1689 <p>
1690 The scope of this problem, if it is a problem, is unknown.  Function
1691 object arguments to generic algorithms in clauses 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a>
1692 and 26 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.numerics"> [lib.numerics]</a> are obvious examples.  A review of the whole
1693 library is necessary.
1694 </p>
1695 <p><b>Proposed resolution:</b></p>
1696 <p><i>[
1697 This is really two issues.  First, predicates are typically passed by
1698 value but we don't say they must be Copy Constructible.  They should
1699 be. Second: is specialization allowed to transform value arguments
1700 into references? References aren't copy constructible, so this should
1701 not be allowed.
1702 ]</i></p>
1703 <hr>
1704 <a name="387"><h3>387.&nbsp;std::complex over-encapsulated</h3></a><p><b>Section:</b>&nbsp;26.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.numbers"> [lib.complex.numbers]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Gabriel Dos Reis&nbsp; <b>Date:</b>&nbsp;8 Nov 2002</p>
1705 <p>
1706 The absence of explicit description of std::complex&lt;T&gt; layout
1707 makes it imposible to reuse existing software developed in traditional
1708 languages like Fortran or C with unambigous and commonly accepted
1709 layout assumptions.  There ought to be a way for practitioners to
1710 predict with confidence the layout of std::complex&lt;T&gt; whenever T
1711 is a numerical datatype.  The absence of ways to access individual
1712 parts of a std::complex&lt;T&gt; object as lvalues unduly promotes
1713 severe pessimizations. For example, the only way to change,
1714 independently, the real and imaginary parts is to write something like
1715 </p>
1716
1717 <pre>complex&lt;T&gt; z;
1718 // ...
1719 // set the real part to r
1720 z = complex&lt;T&gt;(r, z.imag());
1721 // ...
1722 // set the imaginary part to i
1723 z = complex&lt;T&gt;(z.real(), i);
1724 </pre>
1725
1726 <p>
1727 At this point, it seems appropriate to recall that a complex number
1728 is, in effect, just a pair of numbers with no particular invariant to
1729 maintain.  Existing practice in numerical computations has it that a
1730 complex number datatype is usually represented by Cartesian
1731 coordinates. Therefore the over-encapsulation put in the specification
1732 of std::complex&lt;&gt; is not justified.
1733 </p>
1734
1735 <p><b>Proposed resolution:</b></p>
1736 <p>Add the following requirements to 26.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.numbers"> [lib.complex.numbers]</a> as 26.2/4:</p>
1737 <blockquote>
1738 <p>If z is an lvalue expression of type cv std::complex&lt;T&gt; then</p>
1739
1740 <ul>
1741 <li>the expression reinterpret_cast&lt;cv T(&amp;)[2]&gt;(z)
1742 is well-formed; and</li>
1743 <li>reinterpret_cast&lt;cvT(&amp;)[2]&gt;(z)[0]designates the
1744 real part of z; and</li>
1745 <li>reinterpret_cast&lt;cvT(&amp;)[2]&gt;(z)[1]designates the
1746 imaginary part of z.</li>
1747 </ul>
1748
1749 <p>
1750 Moreover, if a is an expression of pointer type cv complex&lt;T&gt;*
1751 and the expression a[i] is well-defined for an integer expression
1752 i then:
1753 </p>
1754
1755 <ul>
1756 <li>reinterpret_cast&lt;cvT*&gt;(a)[2+i] designates the real
1757 part of a[i]; and</li>
1758 <li>reinterpret_cast&lt;cv T*&gt;(a)[2+i+1] designates the
1759 imaginary part of a[i].</li>
1760 </ul>
1761 </blockquote>
1762
1763 <p>In the header synopsis in 26.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.synopsis"> [lib.complex.synopsis]</a>, replace</p>
1764 <pre>  template&lt;class T&gt; T real(const complex&lt;T&gt;&amp;);
1765   template&lt;class T&gt; T imag(const complex&lt;T&gt;&amp;);
1766 </pre>
1767
1768 <p>with</p>
1769
1770 <pre>  template&lt;class T&gt; const T&amp; real(const complex&lt;T&gt;&amp;);
1771   template&lt;class T&gt;       T&amp; real(      complex&lt;T&gt;&amp;);
1772   template&lt;class T&gt; const T&amp; imag(const complex&lt;T&gt;&amp;);
1773   template&lt;class T&gt;       T&amp; imag(      complex&lt;T&gt;&amp;);
1774 </pre>
1775
1776 <p>In 26.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.value.ops"> [lib.complex.value.ops]</a> paragraph 1, change</p>
1777 <pre>  template&lt;class T&gt; T real(const complex&lt;T&gt;&amp;);
1778 </pre>
1779 <p>to</p>
1780 <pre>  template&lt;class T&gt; const T&amp; real(const complex&lt;T&gt;&amp;);
1781   template&lt;class T&gt;       T&amp; real(      complex&lt;T&gt;&amp;);
1782 </pre>
1783 <p>and change the <b>Returns</b> clause to "<b>Returns:</b> The real
1784 part of <i>x</i></p>.
1785
1786 <p>In 26.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.value.ops"> [lib.complex.value.ops]</a> paragraph 2, change</p>
1787 <pre>  template&lt;class T&gt; T imag(const complex&lt;T&gt;&amp;);
1788 </pre>
1789 <p>to</p>
1790 <pre>  template&lt;class T&gt; const T&amp; imag(const complex&lt;T&gt;&amp;);
1791   template&lt;class T&gt;       T&amp; imag(      complex&lt;T&gt;&amp;);
1792 </pre>
1793 <p>and change the <b>Returns</b> clause to "<b>Returns:</b> The imaginary
1794 part of <i>x</i></p>.
1795
1796 <p><i>[Kona: The layout guarantee is absolutely necessary for C
1797   compatibility.  However, there was disagreement about the other part
1798   of this proposal: retrieving elements of the complex number as
1799   lvalues.  An alternative: continue to have real() and imag() return
1800   rvalues, but add set_real() and set_imag().  Straw poll: return
1801   lvalues - 2, add setter functions - 5.  Related issue: do we want
1802   reinterpret_cast as the interface for converting a complex to an
1803   array of two reals, or do we want to provide a more explicit way of
1804   doing it?  Howard will try to resolve this issue for the next
1805   meeting.]</i></p>
1806
1807 <p><i>[pre-Sydney: Howard summarized the options in n1589.]</i></p>
1808
1809 <p><b>Rationale:</b></p>
1810 <p>The LWG believes that C99 compatibility would be enough
1811 justification for this change even without other considerations.  All
1812 existing implementations already have the layout proposed here.</p>
1813 <hr>
1814 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.formatted.reqmts"> [lib.ostream.formatted.reqmts]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;27 Dec 2002</p>
1815 <p>
1816 There is a contradiction in Formatted output about what bit is
1817 supposed to be set if the formatting fails. On sentence says it's
1818 badbit and another that it's failbit.
1819 </p>
1820 <p>
1821 27.6.2.5.1, p1 says in the Common Requirements on Formatted output
1822 functions:
1823 </p><pre>     ... If the generation fails, then the formatted output function
1824      does setstate(ios::failbit), which might throw an exception.
1825 </pre>
1826 <p></p>
1827 <p>
1828 27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters:
1829 </p>
1830 <p>
1831      ... The formatting conversion occurs as if it performed the
1832      following code fragment:
1833 </p>
1834 <p>
1835 </p><pre>     bool failed =
1836          use_facet&lt;num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt;
1837          &gt; &gt;
1838          (getloc()).put(*this, *this, fill(), val). failed();
1839
1840      ... If failed is true then does setstate(badbit) ...
1841 </pre>
1842 <p></p>
1843 <p>
1844 The original intent of the text, according to Jerry Schwarz (see
1845 c++std-lib-10500), is captured in the following paragraph:
1846 </p>
1847 <p>
1848 In general "badbit" should mean that the stream is unusable because
1849 of some underlying failure, such as disk full or socket closure;
1850 "failbit" should mean that the requested formatting wasn't possible
1851 because of some inconsistency such as negative widths.  So typically
1852 if you clear badbit and try to output something else you'll fail
1853 again, but if you clear failbit and try to output something else
1854 you'll succeed.
1855 </p>
1856 <p>
1857 In the case of the arithmetic inserters, since num_put cannot
1858 report failure by any means other than exceptions (in response
1859 to which the stream must set badbit, which prevents the kind of
1860 recoverable error reporting mentioned above), the only other
1861 detectable failure is if the iterator returned from num_put
1862 returns true from failed().
1863 </p>
1864 <p>
1865 Since that can only happen (at least with the required iostream
1866 specializations) under such conditions as the underlying failure
1867 referred to above (e.g., disk full), setting badbit would seem
1868 to be the appropriate response (indeed, it is required in
1869 27.6.2.5.2, p1). It follows that failbit can never be directly
1870 set by the arithmetic (it can only be set by the sentry object
1871 under some unspecified conditions).
1872 </p>
1873 <p>
1874 The situation is different for other formatted output functions
1875 which can fail as a result of the streambuf functions failing
1876 (they may do so by means other than exceptions), and which are
1877 then required to set failbit.
1878 </p>
1879 <p>
1880 The contradiction, then, is that ostream::operator&lt;&lt;(int) will
1881 set badbit if the disk is full, while operator&lt;&lt;(ostream&amp;,
1882 char) will set failbit under the same conditions. To make the behavior
1883 consistent, the Common requirements sections for the Formatted output
1884 functions should be changed as proposed below.
1885 </p>
1886 <p><b>Proposed resolution:</b></p>
1887
1888
1889 <p><i>[Kona: There's agreement that this is a real issue.  What we
1890   decided at Kona: 1. An error from the buffer (which can be detected
1891   either directly from streambuf's member functions or by examining a
1892   streambuf_iterator) should always result in badbit getting set.
1893   2. There should never be a circumstance where failbit gets set.
1894   That represents a formatting error, and there are no circumstances
1895   under which the output facets are specified as signaling a
1896   formatting error. (Even more so for string output that for numeric
1897   because there's nothing to format.)  If we ever decide to make it
1898   possible for formatting errors to exist then the facets can signal
1899   the error directly, and that should go in clause 22, not clause 27.
1900   3. The phrase "if generation fails" is unclear and should be
1901   eliminated.  It's not clear whether it's intended to mean a buffer
1902   error (e.g. a full disk), a formatting error, or something else.
1903   Most people thought it was supposed to refer to buffer errors; if
1904   so, we should say so.  Martin will provide wording.]</i></p>
1905
1906 <p><b>Rationale:</b></p>
1907
1908 <hr>
1909 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.cons"> [lib.bitset.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;5 Jan 2003</p>
1910     <p>
1911 23.3.5.1, p6 [lib.bitset.cons] talks about a generic character
1912 having the value of 0 or 1 but there is no definition of what
1913 that means for charT other than char and wchar_t. And even for
1914 those two types, the values 0 and 1 are not actually what is
1915 intended -- the values '0' and '1' are. This, along with the
1916 converse problem in the description of to_string() in 23.3.5.2,
1917 p33, looks like a defect remotely related to DR 303.
1918     </p>
1919     <p>
1920 http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303
1921     </p>
1922     <pre>23.3.5.1:
1923   -6-  An element of the constructed string has value zero if the
1924        corresponding character in str, beginning at position pos,
1925        is 0. Otherwise, the element has the value one.
1926     </pre>
1927     <pre>23.3.5.2:
1928   -33-  Effects: Constructs a string object of the appropriate
1929         type and initializes it to a string of length N characters.
1930         Each character is determined by the value of its
1931         corresponding bit position in *this. Character position N
1932         ?- 1 corresponds to bit position zero. Subsequent decreasing
1933         character positions correspond to increasing bit positions.
1934         Bit value zero becomes the character 0, bit value one becomes
1935         the character 1.
1936     </pre>
1937     <p>
1938 Also note the typo in 23.3.5.1, p6: the object under construction
1939 is a bitset, not a string.
1940     </p>
1941   <p><b>Proposed resolution:</b></p>
1942 <p>Change the constructor's function declaration immediately before 
1943 23.3.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.cons"> [lib.bitset.cons]</a> p3 to:</p>
1944 <pre>    template &lt;class charT, class traits, class Allocator&gt;
1945     explicit
1946     bitset(const basic_string&lt;charT, traits, Allocator&gt;&amp; str,
1947            typename basic_string&lt;charT, traits, Allocator&gt;::size_type pos = 0,
1948            typename basic_string&lt;charT, traits, Allocator&gt;::size_type n =
1949              basic_string&lt;charT, traits, Allocator&gt;::npos,
1950            charT zero = charT('0'), charT one = charT('1'))
1951 </pre>
1952 <p>Change the first two sentences of 23.3.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.cons"> [lib.bitset.cons]</a> p6 to: "An
1953 element of the constructed string has value 0 if the corresponding
1954 character in <i>str</i>, beginning at position <i>pos</i>,
1955 is <i>zero</i>. Otherwise, the element has the value 1.</p>
1956
1957 <p>Change the text of the second sentence in 23.3.5.1, p5 to read:
1958     "The function then throws invalid_argument if any of the rlen
1959     characters in str beginning at position pos is other than <i>zero</i>
1960     or <i>one</i>. The function uses traits::eq() to compare the character
1961     values."
1962 </p>
1963
1964 <p>Change the declaration of the <tt>to_string</tt> member function
1965   immediately before 23.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.members"> [lib.bitset.members]</a> p33 to:</p>
1966 <pre>    template &lt;class charT, class traits, class Allocator&gt;
1967     basic_string&lt;charT, traits, Allocator&gt; 
1968     to_string(charT zero = charT('0'), charT one = charT('1')) const;
1969 </pre>
1970 <p>Change the last sentence of 23.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.members"> [lib.bitset.members]</a> p33 to: "Bit
1971   value 0 becomes the character <tt><i>zero</i></tt>, bit value 1 becomes the
1972   character <tt><i>one</i></tt>.</p>
1973 <p>Change 23.3.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.operators"> [lib.bitset.operators]</a> p8 to:</p>
1974 <p><b>Returns</b>:</p> 
1975 <pre>  os &lt;&lt; x.template to_string&lt;charT,traits,allocator&lt;charT&gt; &gt;(
1976       use_facet&lt;ctype&lt;charT&gt; &gt;(<i>os</i>.getloc()).widen('0'),
1977       use_facet&lt;ctype&lt;charT&gt; &gt;(<i>os</i>.getloc()).widen('1'));
1978 </pre>
1979 <p><b>Rationale:</b></p>
1980 <p>There is a real problem here: we need the character values of '0'
1981   and '1', and we have no way to get them since strings don't have
1982   imbued locales. In principle the "right" solution would be to
1983   provide an extra object, either a ctype facet or a full locale,
1984   which would be used to widen '0' and '1'. However, there was some
1985   discomfort about using such a heavyweight mechanism.  The proposed
1986   resolution allows those users who care about this issue to get it
1987   right.</p>
1988 <p>We fix the inserter to use the new arguments.  Note that we already
1989   fixed the analogous problem with the extractor in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#303">303</a>.</p>
1990
1991 <hr>
1992 <a name="397"><h3>397.&nbsp;ostream::sentry dtor throws exceptions</h3></a><p><b>Section:</b>&nbsp;27.6.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream::sentry"> [lib.ostream::sentry]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;5 Jan 2003</p>
1993     <p>
1994 17.4.4.8, p3 prohibits library dtors from throwing exceptions.
1995     </p>
1996     <p>
1997 27.6.2.3, p4 says this about the ostream::sentry dtor:
1998     </p>
1999     <pre>    -4- If ((os.flags() &amp; ios_base::unitbuf) &amp;&amp; !uncaught_exception())
2000         is true, calls os.flush().
2001     </pre>
2002     <p>
2003 27.6.2.6, p7 that describes ostream::flush() says:
2004     </p>
2005     <pre>    -7- If rdbuf() is not a null pointer, calls rdbuf()-&gt;pubsync().
2006         If that function returns ?-1 calls setstate(badbit) (which
2007         may throw ios_base::failure (27.4.4.3)).
2008     </pre>
2009     <p>
2010 That seems like a defect, since both pubsync() and setstate() can
2011 throw an exception. 
2012     </p>
2013   <p><b>Proposed resolution:</b></p>
2014 <p><i>[
2015 The contradiction is real.  Clause 17 says destructors may never
2016 throw exceptions, and clause 27 specifies a destructor that does
2017 throw.  In principle we might change either one.  We're leaning
2018 toward changing clause 17: putting in an "unless otherwise specified"
2019 clause, and then putting in a footnote saying the sentry destructor
2020 is the only one that can throw.  PJP suggests specifying that
2021 sentry::~sentry() should internally catch any exceptions it might cause.
2022 ]</i></p>
2023 <hr>
2024 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream::sentry"> [lib.ostream::sentry]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;5 Jan 2003</p>
2025     <p>
2026 While reviewing unformatted input member functions of istream
2027 for their behavior when they encounter end-of-file during input
2028 I found that the requirements vary, sometimes unexpectedly, and
2029 in more than one case even contradict established practice (GNU
2030 libstdc++ 3.2, IBM VAC++ 6.0, STLPort 4.5, SunPro 5.3, HP aCC
2031 5.38, Rogue Wave libstd 3.1, and Classic Iostreams).
2032     </p>
2033     <p>
2034 The following unformatted input member functions set eofbit if they
2035 encounter an end-of-file (this is the expected behavior, and also
2036 the behavior of all major implementations):
2037     </p>
2038     <p>
2039     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2040     get (char_type*, streamsize, char_type);
2041     </pre>
2042     <p></p>
2043     <p>
2044     Also sets failbit if it fails to extract any characters.
2045     </p>
2046     <p>
2047     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2048     get (char_type*, streamsize);
2049     </pre>
2050     <p></p>
2051     <p>
2052     Also sets failbit if it fails to extract any characters.
2053     </p>
2054     <p>
2055     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2056     getline (char_type*, streamsize, char_type);
2057     </pre>
2058     <p></p>
2059     <p>
2060     Also sets failbit if it fails to extract any characters.
2061     </p>
2062     <p>
2063     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2064     getline (char_type*, streamsize);
2065     </pre>
2066     <p></p>
2067     <p>
2068     Also sets failbit if it fails to extract any characters.
2069     </p>
2070     <p>
2071     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2072     ignore (int, int_type);
2073     </pre>
2074     <p></p>
2075     <p>
2076     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2077     read (char_type*, streamsize);
2078     </pre>
2079     <p></p>
2080     <p>
2081     Also sets failbit if it encounters end-of-file.
2082     </p>
2083     <p>
2084     </p><pre>    streamsize readsome (char_type*, streamsize);
2085     </pre>
2086     <p></p>
2087
2088     <p>
2089 The following unformated input member functions set failbit but
2090 not eofbit if they encounter an end-of-file (I find this odd
2091 since the functions make it impossible to distinguish a general
2092 failure from a failure due to end-of-file; the requirement is
2093 also in conflict with all major implementation which set both
2094 eofbit and failbit):
2095     </p>
2096     <p>
2097     </p><pre>    int_type get();
2098     </pre>
2099     <p></p>
2100     <p>
2101     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2102     get (char_type&amp;);
2103     </pre>
2104     <p></p>
2105     <p>
2106 These functions only set failbit of they extract no characters,
2107 otherwise they don't set any bits, even on failure (I find this
2108 inconsistency quite unexpected; the requirement is also in
2109 conflict with all major implementations which set eofbit
2110 whenever they encounter end-of-file):
2111     </p>
2112     <p>
2113     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2114     get (basic_streambuf&lt;charT, traits&gt;&amp;, char_type);
2115     </pre>
2116     <p></p>
2117     <p>
2118     </p><pre>    basic_istream&lt;charT, traits&gt;&amp;
2119     get (basic_streambuf&lt;charT, traits&gt;&amp;);
2120     </pre>
2121     <p></p>
2122     <p>
2123 This function sets no bits (all implementations except for
2124 STLport and Classic Iostreams set eofbit when they encounter
2125 end-of-file):
2126     </p>
2127     <p>
2128     </p><pre>    int_type peek ();
2129     </pre>
2130     <p></p>
2131   <p><b>Proposed resolution:</b></p>
2132 <p>Informally, what we want is a global statement of intent saying
2133   that eofbit gets set if we trip across EOF, and then we can take
2134   away the specific wording for individual functions.  A full review
2135   is necessary.  The wording currently in the standard is a mishmash,
2136   and changing it on an individual basis wouldn't make things better.
2137   Dietmar will do this work.</p>
2138 <hr>
2139 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Markus Mauhart&nbsp; <b>Date:</b>&nbsp;27 Feb 2003</p>
2140 <p>
2141 I think that in par2 of 20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a> the last two
2142 lines of table 32 contain two incorrect type casts. The lines are ...
2143 </p>
2144
2145 <pre>  a.construct(p,t)   Effect: new((void*)p) T(t)
2146   a.destroy(p)       Effect: ((T*)p)?-&gt;~T()
2147 </pre>
2148
2149 <p>
2150 .... with the prerequisits coming from the preceding two paragraphs, especially
2151 from table 31:
2152 </p>
2153
2154 <pre>  alloc&lt;T&gt;             a     ;// an allocator for T
2155   alloc&lt;T&gt;::pointer    p     ;// random access iterator
2156                               // (may be different from T*)
2157   alloc&lt;T&gt;::reference  r = *p;// T&amp;
2158   T const&amp;             t     ;
2159 </pre>
2160
2161 <p>
2162 For that two type casts ("(void*)p" and "(T*)p") to be well-formed
2163 this would require then conversions to T* and void* for all
2164 alloc&lt;T&gt;::pointer, so it would implicitely introduce extra
2165 requirements for alloc&lt;T&gt;::pointer, additionally to the only
2166 current requirement (being a random access iterator).
2167 </p>
2168 <p><b>Proposed resolution:</b></p>
2169 <p>
2170 "(void*)p" should be replaced with "(void*)&amp;*p" and that
2171 "((T*)p)?-&gt;" should be replaced with "(*p)." or with
2172 "(&amp;*p)-&gt;".
2173 </p>
2174
2175 <p>
2176 Note: Actually I would prefer to replace "((T*)p)?-&gt;dtor_name" with
2177 "p?-&gt;dtor_name", but AFAICS this is not possible cause of an omission
2178 in 13.5.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/over.html#over.ref"> [over.ref]</a> (for which I have filed another DR on 29.11.2002).
2179 </p>
2180
2181 <p><i>[Kona: The LWG thinks this is somewhere on the border between
2182   Open and NAD.  The intend is clear: <tt>construct</tt> constructs an
2183   object at the location <i>p</i>.  It's reading too much into the
2184   description to think that literally calling <tt>new</tt> is
2185   required.  Tweaking this description is low priority until we can do
2186   a thorough review of allocators, and, in particular, allocators with
2187   non-default pointer types.]</i></p>
2188
2189 <hr>
2190 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;3 June 2003</p>
2191 <p>
2192 I've been discussing iterator semantics with Dave Abrahams, and a 
2193 surprise has popped up.  I don't think this has been discussed before.
2194 </p>
2195
2196 <p>
2197 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a> says that the only operation that can be performed on "singular"
2198 iterator values is to assign a non-singular value to them.  (It 
2199 doesn't say they can be destroyed, and that's probably a defect.)  
2200 Some implementations have taken this to imply that there is no need 
2201 to initialize the data member of a reverse_iterator&lt;&gt; in the default
2202 constructor.  As a result, code like
2203 </p>
2204 <blockquote>
2205   std::vector&lt;std::reverse_iterator&lt;char*&gt; &gt; v(7);
2206   v.reserve(1000);
2207 </blockquote>
2208 <p>
2209 invokes undefined behavior, because it must default-initialize the
2210 vector elements, and then copy them to other storage.  Of course many 
2211 other vector operations on these adapters are also left undefined,
2212 and which those are is not reliably deducible from the standard.
2213 </p>
2214
2215 <p>
2216 I don't think that 24.1 was meant to make standard-library iterator 
2217 types unsafe.  Rather, it was meant to restrict what operations may 
2218 be performed by functions which take general user- and standard 
2219 iterators as arguments, so that raw pointers would qualify as
2220 iterators.  However, this is not clear in the text, others have come 
2221 to the opposite conclusion.
2222 </p>
2223
2224 <p>
2225 One question is whether the standard iterator adaptors have defined
2226 copy semantics.  Another is whether they have defined destructor
2227 semantics: is
2228 </p>
2229 <blockquote>
2230   { std::vector&lt;std::reverse_iterator&lt;char*&gt; &gt;  v(7); }
2231 </blockquote>
2232 <p>
2233 undefined too?
2234 </p>
2235
2236 <p>
2237 Note this is not a question of whether algorithms are allowed to
2238 rely on copy semantics for arbitrary iterators, just whether the
2239 types we actually supply support those operations.  I believe the 
2240 resolution must be expressed in terms of the semantics of the 
2241 adapter's argument type.  It should make clear that, e.g., the 
2242 reverse_iterator&lt;T&gt; constructor is actually required to execute
2243 T(), and so copying is defined if the result of T() is copyable.
2244 </p>
2245
2246 <p>
2247 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, which defines reverse_iterator's default
2248 constructor more precisely, has some relevance to this issue.
2249 However, it is not the whole story.
2250 </p>
2251
2252 <p>
2253 The issue was whether 
2254 </p>
2255 <blockquote>
2256   reverse_iterator() { }
2257 </blockquote>
2258 <p>
2259 is allowed, vs. 
2260 </p>
2261 <blockquote>
2262   reverse_iterator() : current() { }
2263 </blockquote>
2264
2265 <p>
2266 The difference is when T is char*, where the first leaves the member
2267 uninitialized, and possibly equal to an existing pointer value, or
2268 (on some targets) may result in a hardware trap when copied.
2269 </p>
2270
2271 <p>
2272 8.5 paragraph 5 seems to make clear that the second is required to
2273 satisfy DR <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#235">235</a>, at least for non-class Iterator argument
2274 types.
2275 </p>
2276
2277 <p>
2278 But that only takes care of reverse_iterator, and doesn't establish
2279 a policy for all iterators.  (The reverse iterator adapter was just
2280 an example.)  In particular, does my function
2281 </p>
2282 <blockquote>
2283   template &lt;typename Iterator&gt;
2284     void f() { std::vector&lt;Iterator&gt;  v(7); } 
2285 </blockquote>
2286 <p>
2287 evoke undefined behavior for some conforming iterator definitions?
2288 I think it does, now, because vector&lt;&gt; will destroy those singular
2289 iterator values, and that's explicitly disallowed.
2290 </p>
2291
2292 <p>
2293 24.1 shouldn't give blanket permission to copy all singular iterators,
2294 because then pointers wouldn't qualify as iterators.  However, it
2295 should allow copying of that subset of singular iterator values that
2296 are default-initialized, and it should explicitly allow destroying any
2297 iterator value, singular or not, default-initialized or not.
2298 </p>
2299
2300 <p>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#407">407</a></p>
2301 <p><b>Proposed resolution:</b></p>
2302
2303 <p><i>[
2304 We don't want to require all singular iterators to be copyable,
2305 because that is not the case for pointers.  However, default
2306 construction may be a special case.  Issue: is it really default
2307 construction we want to talk about, or is it something like value
2308 initialization?  We need to check with core to see whether default
2309 constructed pointers are required to be copyable; if not, it would be
2310 wrong to impose so strict a requirement for iterators.
2311 ]</i></p>
2312
2313 <hr>
2314 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.c.limits"> [lib.c.limits]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2315         <p>
2316
2317 Given two overloads of the function foo(), one taking an argument of type
2318 int and the other taking a long, which one will the call foo(LONG_MAX)
2319 resolve to? The expected answer should be foo(long), but whether that
2320 is true depends on the #defintion of the LONG_MAX macro, specifically
2321 its type. This issue is about the fact that the type of these macros
2322 is not actually required to be the same as the the type each respective
2323 limit.
2324 <br>
2325
2326 Section 18.2.2 of the C++ Standard does not specify the exact types of
2327 the XXX_MIN and XXX_MAX macros #defined in the &lt;climits&gt; and &lt;limits.h&gt;
2328 headers such as INT_MAX and LONG_MAX and instead defers to the C standard.
2329 <br>
2330
2331 Section 5.2.4.2.1, p1 of the C standard specifies that "The values [of
2332 these constants] shall be replaced by constant expressions suitable for use
2333 in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX,
2334 the following shall be replaced by expressions that have the same type as
2335 would an expression that is an object of the corresponding type converted
2336 according to the integer promotions."
2337 <br>
2338
2339 The "corresponding type converted according to the integer promotions" for
2340 LONG_MAX is, according to 6.4.4.1, p5 of the C standard, the type of long
2341 converted to the first of the following set of types that can represent it:
2342 int, long int, long long int. So on an implementation where (sizeof(long)
2343 == sizeof(int)) this type is actually int, while on an implementation where
2344 (sizeof(long) &gt; sizeof(int)) holds this type will be long.
2345 <br>
2346
2347 This is not an issue in C since the type of the macro cannot be detected
2348 by any conforming C program, but it presents a portability problem in C++
2349 where the actual type is easily detectable by overload resolution.
2350
2351         </p>
2352     <p><b>Proposed resolution:</b></p>
2353
2354 <p><i>[Kona: the LWG does not believe this is a defect.  The C macro
2355   definitions are what they are; we've got a better
2356   mechanism, <tt>std::numeric_limits</tt>, that is specified more
2357   precisely than the C limit macros.  At most we should add a
2358   nonnormative note recommending that users who care about the exact
2359   types of limit quantities should use &lt;limits&gt; instead of
2360   &lt;climits&gt;.]</i></p>
2361
2362 <hr>
2363 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.virtuals"> [lib.locale.ctype.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2364 <p>
2365 The Effects and Returns clauses of the do_widen() member function of
2366 the ctype facet fail to specify the behavior of the function on failure.
2367 That the function may not be able to simply cast the narrow character
2368 argument to the type of the result since doing so may yield the wrong value
2369 for some wchar_t encodings. Popular implementations of ctype&lt;wchar_t&gt; that
2370 use mbtowc() and UTF-8 as the native encoding (e.g., GNU glibc) will fail
2371 when the argument's MSB is set. There is no way for the the rest of locale
2372 and iostream to reliably detect this failure. 
2373 </p>
2374 <p><b>Proposed resolution:</b></p>
2375 <p><i>[Kona: This is a real problem.  Widening can fail.  It's unclear
2376   what the solution should be.  Returning WEOF works for the wchar_t
2377   specialization, but not in general.  One option might be to add a
2378   default, like <i>narrow</i>.  But that's an incompatible change.
2379   Using <i>traits::eof</i> might seem like a good idea, but facets
2380   don't have access to traits (a recurring problem).  We could
2381   have <i>widen</i> throw an exception, but that's a scary option;
2382   existing library components aren't written with the assumption
2383   that <i>widen</i> can throw.]</i></p>
2384 <hr>
2385 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios::Init"> [lib.ios::Init]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2386 <p>
2387 The dtor of the ios_base::Init object is supposed to call flush() on the
2388 6 standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog.
2389 This call may cause an exception to be thrown.
2390 </p>
2391
2392 <p>
2393 17.4.4.8, p3 prohibits all library destructors from throwing exceptions.
2394 </p>
2395
2396 <p>
2397 The question is: What should this dtor do if one or more of these calls
2398 to flush() ends up throwing an exception? This can happen quite easily
2399 if one of the facets installed in the locale imbued in the iostream
2400 object throws.
2401 </p>
2402 <p><b>Proposed resolution:</b></p>
2403 <p><i>[Kona: We probably can't do much better than what we've got, so
2404   the LWG is leaning toward NAD.  At the point where the standard
2405   stream objects are being cleaned up, the usual error reporting
2406   mechanism are all unavailable.  And exception from flush at this
2407   point will definitely cause problems.  A quality implementation
2408   might reasonably swallow the exception, or call abort, or do
2409   something even more drastic.]</i></p>
2410 <hr>
2411 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::sentry"> [lib.istream::sentry]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2412         <p>
2413
2414 27.6.1.1.2, p2 says that istream::sentry ctor prepares for input if is.good()
2415 is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to
2416 true if the stream state is good after any preparation. 27.6.1.2.1, p1 then
2417 says that a formatted input function endeavors to obtain the requested input
2418 if the sentry's operator bool() returns true.
2419
2420 Given these requirements, no formatted extractor should ever set failbit if
2421 the initial stream rdstate() == eofbit. That is contrary to the behavior of
2422 all implementations I tested. The program below prints out
2423
2424 eof = 1, fail = 0
2425 eof = 1, fail = 1
2426
2427 on all of them.
2428         </p>
2429 <pre>
2430 #include &lt;sstream&gt;
2431 #include &lt;cstdio&gt;
2432
2433 int main()
2434 {
2435     std::istringstream strm ("1");
2436
2437     int i = 0;
2438
2439     strm &gt;&gt; i;
2440
2441     std::printf ("eof = %d, fail = %d\n",
2442                  !!strm.eof (), !!strm.fail ());
2443
2444     strm &gt;&gt; i;
2445
2446     std::printf ("eof = %d, fail = %d\n",
2447                  !!strm.eof (), !!strm.fail ());
2448 }
2449
2450 </pre>
2451         <p>
2452 <br>
2453
2454 Comments from Jerry Schwarz (c++std-lib-11373):
2455 <br>
2456
2457 Jerry Schwarz wrote:
2458 <br>
2459
2460 I don't know where (if anywhere) it says it in the standard, but the
2461 formatted extractors are supposed to set failbit if they don't extract
2462 any characters. If they didn't then simple loops like
2463 <br>
2464
2465 while (cin &gt;&gt; x);
2466 <br>
2467
2468 would loop forever.
2469 <br>
2470
2471 Further comments from Martin Sebor:
2472 <br>
2473
2474 The question is which part of the extraction should prevent this from happening
2475 by setting failbit when eofbit is already set. It could either be the sentry
2476 object or the extractor. It seems that most implementations have chosen to
2477 set failbit in the sentry [...] so that's the text that will need to be
2478 corrected. 
2479
2480         </p>
2481     <p><b>Proposed resolution:</b></p>
2482 <p>Kona: Possibly NAD.  If eofbit is set then good() will return false.  We
2483   then set <i>ok</i> to false.  We believe that the sentry's
2484   constructor should always set failbit when <i>ok</i> is false, and
2485   we also think the standard already says that.  Possibly it could be
2486   clearer.</p> 
2487   
2488 <hr>
2489 <a name="421"><h3>421.&nbsp;is basic_streambuf copy-constructible?</h3></a><p><b>Section:</b>&nbsp;27.5.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.cons"> [lib.streambuf.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2490 <p>
2491 The reflector thread starting with c++std-lib-11346 notes that the class
2492 template basic_streambuf, along with basic_stringbuf and basic_filebuf,
2493 is copy-constructible but that the semantics of the copy constructors
2494 are not defined anywhere. Further, different implementations behave
2495 differently in this respect: some prevent copy construction of objects
2496 of these types by declaring their copy ctors and assignment operators
2497 private, others exhibit undefined behavior, while others still give
2498 these operations well-defined semantics.
2499 </p>
2500
2501 <p>
2502 Note that this problem doesn't seem to be isolated to just the three
2503 types mentioned above. A number of other types in the library section
2504 of the standard provide a compiler-generated copy ctor and assignment
2505 operator yet fail to specify their semantics.  It's believed that the
2506 only types for which this is actually a problem (i.e. types where the
2507 compiler-generated default may be inappropriate and may not have been
2508 intended) are locale facets.  See issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#439">439</a>.
2509 </p>
2510 <p><b>Proposed resolution:</b></p>
2511 <p>
2512 27.5.2 [lib.streambuf]:  Add into the synopsis, public section, just above the destructor declaration:
2513 </p>
2514
2515 <blockquote>
2516 <pre>basic_streambuf(const basic_streambuf&amp; sb);
2517 basic_streambuf&amp; operator=(const basic_streambuf&amp; sb);
2518 </pre>
2519 </blockquote>
2520
2521 <p>Insert after 27.5.2.1, paragraph 2:</p>
2522 <blockquote>
2523 <pre>basic_streambuf(const basic_streambuf&amp; sb);
2524 </pre>
2525
2526 <p>Constructs a copy of sb.</p>
2527 <p>Postcondtions:</p>
2528 <pre>                eback() == sb.eback()
2529                 gptr()  == sb.gptr()
2530                 egptr() == sb.egptr()
2531                 pbase() == sb.pbase()
2532                 pptr()  == sb.pptr()
2533                 epptr() == sb.epptr()
2534                 getloc() == sb.getloc()
2535 </pre>
2536
2537 <pre>basic_streambuf&amp; operator=(const basic_streambuf&amp; sb);
2538 </pre>
2539
2540 <p>Assigns the data members of sb to this.</p>
2541
2542 <p>Postcondtions:</p>
2543 <pre>                eback() == sb.eback()
2544                 gptr()  == sb.gptr()
2545                 egptr() == sb.egptr()
2546                 pbase() == sb.pbase()
2547                 pptr()  == sb.pptr()
2548                 epptr() == sb.epptr()
2549                 getloc() == sb.getloc()
2550 </pre>
2551
2552 <p>Returns: *this.</p>
2553 </blockquote>
2554
2555 <p>27.7.1 [lib.stringbuf]:</p>
2556
2557 <b>Option A:</b>
2558
2559 <blockquote>
2560 <p>Insert into the basic_stringbuf synopsis in the private section:</p>
2561
2562 <pre>basic_stringbuf(const basic_stringbuf&amp;);             // not defined
2563 basic_stringbuf&amp; operator=(const basic_stringbuf&amp;);  // not defined
2564 </pre>
2565 </blockquote>
2566
2567 <b>Option B:</b>
2568
2569 <blockquote>
2570 <p>Insert into the basic_stringbuf synopsis in the public section:</p>
2571
2572 <pre>basic_stringbuf(const basic_stringbuf&amp; sb);
2573 basic_stringbuf&amp; operator=(const basic_stringbuf&amp; sb);
2574 </pre>
2575
2576 <p>27.7.1.1, insert after paragraph 4:</p>
2577
2578 <pre>basic_stringbuf(const basic_stringbuf&amp; sb);</pre>
2579
2580 <p>
2581 Constructs an independent copy of sb as if with sb.str(), and with the openmode that sb was constructed with.
2582 </p>
2583
2584 <p>Postcondtions: </p>
2585 <pre>               str() == sb.str()
2586                gptr()  - eback() == sb.gptr()  - sb.eback()
2587                egptr() - eback() == sb.egptr() - sb.eback()
2588                pptr()  - pbase() == sb.pptr()  - sb.pbase()
2589                getloc() == sb.getloc()
2590 </pre>
2591
2592 <p>
2593 Note: The only requirement on epptr() is that it point beyond the
2594 initialized range if an output sequence exists. There is no requirement
2595 that epptr() - pbase() == sb.epptr() - sb.pbase().
2596 </p>
2597
2598 <pre>basic_stringbuf&amp; operator=(const basic_stringbuf&amp; sb);</pre>
2599 <p>After assignment the basic_stringbuf has the same state as if it
2600 were initially copy constructed from sb, except that the
2601 basic_stringbuf is allowed to retain any excess capacity it might have,
2602 which may in turn effect the value of epptr().
2603 </p>
2604 </blockquote>
2605
2606 <p>27.8.1.1 [lib.filebuf]</p>
2607
2608 <p>Insert at the bottom of the basic_filebuf synopsis:</p>
2609
2610 <blockquote>
2611 <pre>private:
2612   basic_filebuf(const basic_filebuf&amp;);             // not defined
2613   basic_filebuf&amp; operator=(const basic_filebuf&amp;);  // not defined
2614 </pre>
2615 </blockquote>
2616 <p><i>[Kona: this is an issue for basic_streambuf itself and for its
2617   derived classes.  We are leaning toward allowing basic_streambuf to
2618   be copyable, and specifying its precise semantics.  (Probably the
2619   obvious: copying the buffer pointers.)  We are less sure whether
2620   the streambuf derived classes should be copyable.  Howard will
2621   write up a proposal.]</i></p>
2622
2623 <p><i>[Sydney: Dietmar presented a new argument against basic_streambuf
2624   being copyable: it can lead to an encapsulation violation. Filebuf
2625   inherits from streambuf. Now suppose you inhert a my_hijacking_buf
2626   from streambuf. You can copy the streambuf portion of a filebuf to a
2627   my_hijacking_buf, giving you access to the pointers into the
2628   filebuf's internal buffer. Perhaps not a very strong argument, but
2629   it was strong enough to make people nervous. There was weak
2630   preference for having streambuf not be copyable. There was weak
2631   preference for having stringbuf not be copyable even if streambuf
2632   is. Move this issue to open for now.
2633 ]</i></p>
2634
2635 <p><b>Rationale:</b></p>
2636 <p>
2637 27.5.2 [lib.streambuf]: The proposed basic_streambuf copy constructor
2638 and assignment operator are the same as currently implied by the lack
2639 of declarations: public and simply copies the data members.  This
2640 resolution is not a change but a clarification of the current
2641 standard.
2642 </p>
2643
2644 <p>
2645 27.7.1 [lib.stringbuf]: There are two reasonable options: A) Make
2646 basic_stringbuf not copyable.  This is likely the status-quo of
2647 current implementations.  B) Reasonable copy semantics of
2648 basic_stringbuf can be defined and implemented.  A copyable
2649 basic_streambuf is arguably more useful than a non-copyable one.  This
2650 should be considered as new functionality and not the fixing of a
2651 defect.  If option B is chosen, ramifications from issue 432 are taken
2652 into account.
2653 </p>
2654
2655 <p>
2656 27.8.1.1 [lib.filebuf]: There are no reasonable copy semantics for
2657 basic_filebuf.
2658 </p>
2659
2660 <hr>
2661 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.reserved.names"> [lib.reserved.names]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2662 <p>
2663 It has been suggested that 17.4.3.1, p1 may or may not allow programs to
2664 explicitly specialize members of standard templates on user-defined types.
2665 The answer to the question might have an impact where library requirements
2666 are given using the "as if" rule. I.e., if programs are allowed to specialize
2667 member functions they will be able to detect an implementation's strict
2668 conformance to Effects clauses that describe the behavior of the function
2669 in terms of the other member function (the one explicitly specialized by
2670 the program) by relying on the "as if" rule.
2671 </p>
2672 <p><b>Proposed resolution:</b></p>
2673
2674 <p>
2675   Add the following sentence immediately after the text of 17.4.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.reserved.names"> [lib.reserved.names]</a>, p1:
2676 </p>
2677
2678 <blockquote>
2679     The behavior of a program that declares explicit specializations
2680     of any members of class templates or explicit specializations of
2681     any member templates of classes or class templates defined in
2682     this library is undefined.
2683 </blockquote>
2684
2685
2686 <p><i>[Kona: straw poll was 6-1 that user programs should not be
2687   allowed to specialize individual member functions of standard
2688   library class templates, and that doing so invokes undefined
2689   behavior. Post-Kona: Martin provided wording.]</i></p>
2690
2691 <p><i>[Sydney: The LWG agrees that the standard shouldn't permit users
2692 to specialize individual member functions unless they specialize the
2693 whole class, but we're not sure these words say what we want them to;
2694 they could be read as prohibiting the specialization of any standard
2695 library class templates. We need to consult with CWG to make sure we
2696 use the right wording.]</i></p>
2697
2698 <hr>
2699 <a name="423"><h3>423.&nbsp;effects of negative streamsize in iostreams</h3></a><p><b>Section:</b>&nbsp;27 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.input.output"> [lib.input.output]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2700
2701 <p>
2702 A third party test suite tries to exercise istream::ignore(N) with
2703 a negative value of N and expects that the implementation will treat
2704 N as if it were 0. Our implementation asserts that (N &gt;= 0) holds and
2705 aborts the test.
2706 </p>
2707
2708 <p>
2709 I can't find anything in section 27 that prohibits such values but I don't
2710 see what the effects of such calls should be, either (this applies to
2711 a number of unformatted input functions as well as some member functions
2712 of the basic_streambuf template).
2713 </p>
2714 <p><b>Proposed resolution:</b></p>
2715 <p>
2716 I propose that we add to each function in clause 27 that takes an argument,
2717 say N, of type streamsize a Requires clause saying that "N &gt;= 0." The intent
2718 is to allow negative streamsize values in calls to precision() and width()
2719 but disallow it in calls to streambuf::sgetn(), istream::ignore(), or
2720 ostream::write().
2721 </p>
2722
2723 <p><i>[Kona: The LWG agreed that this is probably what we want.  However, we
2724   need a review to find all places where functions in clause 27 take
2725   arguments of type streamsize that shouldn't be allowed to go
2726   negative.  Martin will do that review.]</i></p>
2727
2728 <hr>
2729 <a name="424"><h3>424.&nbsp;normative notes</h3></a><p><b>Section:</b>&nbsp;17.3.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.structure.summary"> [lib.structure.summary]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2730
2731 <p>
2732 The text in 17.3.1.1, p1 says:
2733 <br>
2734
2735 "Paragraphs labelled "Note(s):" or "Example(s):" are informative, other
2736 paragraphs are normative."
2737 <br>
2738
2739 The library section makes heavy use of paragraphs labeled "Notes(s),"
2740 some of which are clearly intended to be normative (see list 1), while
2741 some others are not (see list 2). There are also those where the intent
2742 is not so clear (see list 3).
2743 <br>
2744
2745 List 1 -- Examples of (presumably) normative Notes:
2746 <br>
2747
2748 20.4.1.1, p3, 20.4.1.1, p10, 21.3.1, p11, 22.1.1.2, p11, 23.2.1.3, p2,
2749 25.3.7, p3, 26.2.6, p14a, 27.5.2.4.3, p7.
2750 <br>
2751
2752 List 2 -- Examples of (presumably) informative Notes:
2753 <br>
2754
2755 18.4.1.3, p3, 21.3.5.6, p14, 22.2.1.5.2, p3, 25.1.1, p4, 26.2.5, p1,
2756 27.4.2.5, p6.
2757 <br>
2758
2759 List 3 -- Examples of Notes that are not clearly either normative
2760 or informative:
2761 <br>
2762
2763 22.1.1.2, p8, 22.1.1.5, p6, 27.5.2.4.5, p4.
2764 <br>
2765
2766 None of these lists is meant to be exhaustive.
2767 </p>
2768
2769 <p><b>Proposed resolution:</b></p>
2770
2771 <p><i>[Definitely a real problem.  The big problem is there's material
2772   that doesn't quite fit any of the named paragraph categories
2773   (e.g. <b>Effects</b>).  Either we need a new kind of named
2774   paragraph, or we need to put more material in unnamed paragraphs
2775   jsut after the signature.  We need to talk to the Project Editor
2776   about how to do this.
2777 ]</i></p>
2778
2779 <hr>
2780 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.virtuals"> [lib.facet.num.get.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2781 <p>
2782 The requirements specified in Stage 2 and reiterated in the rationale
2783 of DR 221 (and echoed again in DR 303) specify that num_get&lt;charT&gt;::
2784 do_get() compares characters on the stream against the widened elements
2785 of "012...abc...ABCX+-"
2786 </p>
2787
2788 <p>
2789 An implementation is required to allow programs to instantiate the num_get
2790 template on any charT that satisfies the requirements on a user-defined
2791 character type. These requirements do not include the ability of the
2792 character type to be equality comparable (the char_traits template must
2793 be used to perform tests for equality). Hence, the num_get template cannot
2794 be implemented to support any arbitrary character type. The num_get template
2795 must either make the assumption that the character type is equality-comparable
2796 (as some popular implementations do), or it may use char_traits&lt;charT&gt; to do
2797 the comparisons (some other popular implementations do that). This diversity
2798 of approaches makes it difficult to write portable programs that attempt to
2799 instantiate the num_get template on user-defined types.
2800 </p>
2801 <p><b>Proposed resolution:</b></p>
2802 <p><i>[Kona: the heart of the problem is that we're theoretically
2803   supposed to use traits classes for all fundamental character
2804   operations like assignment and comparison, but facets don't have
2805   traits parameters.  This is a fundamental design flaw and it
2806   appears all over the place, not just in this one place.  It's not
2807   clear what the correct solution is, but a thorough review of facets
2808   and traits is in order.  The LWG considered and rejected the
2809   possibility of changing numeric facets to use narrowing instead of
2810   widening.  This may be a good idea for other reasons (see issue
2811   <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#459">459</a>), but it doesn't solve the problem raised by this
2812   issue.  Whether we use widen or narrow the <tt>num_get</tt> facet
2813   still has no idea which traits class the user wants to use for 
2814   the comparison, because only streams, not facets, are passed traits
2815   classes.   The standard does not require that two different
2816   traits classes with the same <tt>char_type</tt> must necessarily 
2817   have the same behavior.]</i></p>
2818
2819 <p>Informally, one possibility: require that some of the basic
2820 character operations, such as <tt>eq</tt>, <tt>lt</tt>,
2821 and <tt>assign</tt>, must behave the same way for all traits classes
2822 with the same <tt>char_type</tt>.  If we accept that limitation on
2823 traits classes, then the facet could reasonably be required to
2824 use <tt>char_traits&lt;charT&gt;</tt></p>.
2825
2826 <hr>
2827 <a name="430"><h3>430.&nbsp;valarray subset operations</h3></a><p><b>Section:</b>&nbsp;26.3.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.sub"> [lib.valarray.sub]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
2828 <p>
2829 The standard fails to specify the behavior of valarray::operator[](slice)
2830 and other valarray subset operations when they are passed an "invalid"
2831 slice object, i.e., either a slice that doesn't make sense at all (e.g.,
2832 slice (0, 1, 0) or one that doesn't specify a valid subset of the valarray
2833 object (e.g., slice (2, 1, 1) for a valarray of size 1).
2834 </p>
2835 <p><b>Proposed resolution:</b></p>
2836 <p><i>[Kona: the LWG believes that invalid slices should invoke
2837   undefined behavior.  Valarrays are supposed to be designed for high
2838   performance, so we don't want to require specific checking.  We
2839   need wording to express this decision.]</i></p>
2840 <hr>
2841 <a name="431"><h3>431.&nbsp;Swapping containers with unequal allocators</h3></a><p><b>Section:</b>&nbsp;20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a>, 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;20 Sep 2003</p>
2842 <p>Clause 20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a> paragraph 4 says that implementations
2843   are permitted to supply containers that are unable to cope with
2844   allocator instances and that container implementations may assume
2845   that all instances of an allocator type compare equal.  We gave
2846   implementers this latitude as a temporary hack, and eventually we
2847   want to get rid of it.  What happens when we're dealing with
2848   allocators that <i>don't</i> compare equal?
2849 </p>
2850
2851 <p>In particular: suppose that <tt>v1</tt> and <tt>v2</tt> are both
2852   objects of type <tt>vector&lt;int, my_alloc&gt;</tt> and that
2853   <tt>v1.get_allocator() != v2.get_allocator()</tt>.  What happens if
2854   we write <tt>v1.swap(v2)</tt>?  Informally, three possibilities:</p>
2855
2856 <p>1. This operation is illegal.  Perhaps we could say that an
2857   implementation is required to check and to throw an exception, or
2858   perhaps we could say it's undefined behavior.</p>
2859 <p>2. The operation performs a slow swap (i.e. using three
2860   invocations of <tt>operator=</tt>, leaving each allocator with its
2861   original container.  This would be an O(N) operation.</p>
2862 <p>3. The operation swaps both the vectors' contents and their
2863   allocators.  This would be an O(1) operation. That is:</p>
2864   <blockquote>
2865   <pre>    my_alloc a1(...);
2866     my_alloc a2(...);
2867     assert(a1 != a2);
2868
2869     vector&lt;int, my_alloc&gt; v1(a1);
2870     vector&lt;int, my_alloc&gt; v2(a2);
2871     assert(a1 == v1.get_allocator());
2872     assert(a2 == v2.get_allocator());
2873
2874     v1.swap(v2);
2875     assert(a1 == v2.get_allocator());
2876     assert(a2 == v1.get_allocator());
2877   </pre>
2878   </blockquote>
2879
2880 <p><b>Proposed resolution:</b></p>
2881
2882 <p><i>[Kona: This is part of a general problem.  We need a paper
2883   saying how to deal with unequal allocators in general.]</i></p>
2884
2885 <p><i>[pre-Sydney: Howard argues for option 3 in n1599.]</i></p>
2886
2887 <hr>
2888 <a name="446"><h3>446.&nbsp;Iterator equality between different containers</h3></a><p><b>Section:</b>&nbsp;24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>, 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Koenig&nbsp; <b>Date:</b>&nbsp;16 Dec 2003</p>
2889 <p>
2890 What requirements does the standard place on equality comparisons between
2891 iterators that refer to elements of different containers.  For example, if
2892 v1 and v2 are empty vectors, is v1.end() == v2.end() allowed to yield true?
2893 Is it allowed to throw an exception?
2894 </p>
2895
2896 <p>
2897 The standard appears to be silent on both questions.
2898 </p>
2899 <p><b>Proposed resolution:</b></p>
2900
2901 <p><i>[Sydney: The intention is that comparing two iterators from
2902 different containers is undefined, but it's not clear if we say that,
2903 or even whether it's something we should be saying in clause 23 or in
2904 clause 24.  Intuitively we might want to say that equality is defined
2905 only if one iterator is reachable from another, but figuring out how
2906 to say it in any sensible way is a bit tricky: reachability is defined
2907 in terms of equality, so we can't also define equality in terms of
2908 reachability.
2909 ]</i></p>
2910
2911 <hr>
2912 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.members"> [lib.filebuf.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;30 Jan 2004</p>
2913 <pre>    basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);
2914 </pre>
2915
2916 <p>should be supplemented with the overload:</p>
2917
2918 <pre>    basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);
2919 </pre>
2920
2921 <p>
2922 Depending on the operating system, one of these forms is fundamental and
2923 the other requires an implementation-defined mapping to determine the
2924 actual filename.
2925 </p>
2926
2927 <p><i>[Sydney: Yes, we want to allow wchar_t filenames.  Bill will
2928   provide wording.]</i></p>
2929
2930 <p><b>Proposed resolution:</b></p>
2931
2932 <p>Change from:</p>
2933 <blockquote>
2934 <pre>basic_filebuf&lt;charT,traits&gt;* open(
2935         const char* s,
2936         ios_base::openmode mode );
2937 </pre>
2938
2939 <p>
2940 Effects: If is_open() != false, returns a null pointer.
2941 Otherwise, initializes the filebuf as required. It then
2942 opens a file, if possible, whose name is the NTBS s ("as if"
2943 by calling std::fopen(s,modstr)).</p>
2944 </blockquote>
2945
2946 <p>to:</p>
2947
2948 <blockquote>
2949 <pre>basic_filebuf&lt;charT,traits&gt;* open(
2950         const char* s,
2951         ios_base::openmode mode );
2952
2953 basic_filebuf&lt;charT,traits&gt;* open(
2954         const wchar_t* ws,
2955         ios_base::openmode mode );
2956 </pre>
2957
2958 <p>
2959 Effects: If is_open() != false, returns a null pointer.
2960 Otherwise, initializes the filebuf as required. It then
2961 opens a file, if possible, whose name is the NTBS s ("as if"
2962 by calling std::fopen(s,modstr)).
2963 For the second signature, the NTBS s is determined from the
2964 WCBS ws in an implementation-defined manner.
2965 </p>
2966
2967 <p>
2968 (NOTE: For a system that "naturally" represents a filename
2969 as a WCBS, the NTBS s in the first signature may instead
2970 be mapped to a WCBS; if so, it follows the same mapping
2971 rules as the first argument to open.)
2972 </p>
2973 </blockquote>
2974
2975 <p><b>Rationale:</b></p>
2976 <p>
2977 Slightly controversial, but by a 7-1 straw poll the LWG agreed to move
2978 this to Ready.  The controversy was because the mapping between wide
2979 names and files in a filesystem is implementation defined.  The
2980 counterargument, which most but not all LWG members accepted, is that
2981 the mapping between narrow files names and files is also
2982 implemenation defined.</p>
2983
2984 <p><i>[Lillehammer: Moved back to "open" status, at Beman's urging.
2985 (1) Why just basic_filebuf, instead of also basic_fstream (and
2986 possibly other things too). (2) Why not also constructors that take
2987 std::basic_string? (3) We might want to wait until we see Beman's
2988 filesystem library; we might decide that it obviates this.]</i></p>
2989
2990 <hr>
2991 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.headers"> [lib.headers]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;30 Jan 2004</p>
2992
2993 <p>The C++ Standard effectively requires that the traditional C headers
2994 (of the form &lt;xxx.h&gt;) be defined in terms of the newer C++
2995 headers (of the form &lt;cxxx&gt;). Clauses 17.4.1.2/4 and D.5 combine
2996 to require that:</p>
2997
2998 <ul>
2999  <li>Including the header &lt;cxxx&gt; declares a C name in namespace std.</li>
3000
3001  <li> Including the header &lt;xxx.h&gt; declares a C name in namespace std
3002     (effectively by including &lt;cxxx&gt;), then imports it into the global
3003     namespace with an individual using declaration.</li>
3004 </ul>
3005
3006 <p>
3007 The rules were left in this form despited repeated and heated objections
3008 from several compiler vendors. The C headers are often beyond the direct
3009 control of C++ implementors. In some organizations, it's all they can do
3010 to get a few #ifdef __cplusplus tests added. Third-party library vendors
3011 can perhaps wrap the C headers. But neither of these approaches supports
3012 the drastic restructuring required by the C++ Standard. As a result, it is
3013 still widespread practice to ignore this conformance requirement, nearly
3014 seven years after the committee last debated this topic. Instead, what is
3015 often implemented is:
3016 </p>
3017
3018 <ul>
3019  <li> Including the header &lt;xxx.h&gt; declares a C name in the
3020  global namespace.</li> 
3021
3022  <li> Including the header &lt;cxxx&gt; declares a C name in the
3023  global namespace (effectively by including &lt;xxx.h&gt;), then
3024  imports it into namespace std with an individual using declaration.</li>
3025 </ul>
3026
3027 <p>
3028 The practical benefit for implementors with the second approach is that
3029 they can use existing C library headers, as they are pretty much obliged
3030 to do. The practical cost for programmers facing a mix of implementations
3031 is that they have to assume weaker rules:</p>
3032
3033 <ul>
3034   <li> If you want to assuredly declare a C name in the global
3035   namespace, include &lt;xxx.h&gt;. You may or may not also get the
3036   declaration in namespace std.</li>
3037
3038   <li> If you want to assuredly declare a C name in namespace std,
3039   include &lt;cxxx.h&gt;. You may or may not also get the declaration in
3040   the global namespace.</li>
3041 </ul>
3042
3043 <p>
3044 There also exists the <i>possibility</i> of subtle differences due to
3045 Koenig lookup, but there are so few non-builtin types defined in the C
3046 headers that I've yet to see an example of any real problems in this
3047 area.
3048 </p>
3049
3050 <p>
3051 It is worth observing that the rate at which programmers fall afoul of
3052 these differences has remained small, at least as measured by newsgroup
3053 postings and our own bug reports. (By an overwhelming margin, the
3054 commonest problem is still that programmers include &lt;string&gt; and can't
3055 understand why the typename string isn't defined -- this a decade after
3056 the committee invented namespace std, nominally for the benefit of all
3057 programmers.)
3058 </p>
3059
3060 <p>
3061 We should accept the fact that we made a serious mistake and rectify it,
3062 however belatedly, by explicitly allowing either of the two schemes for
3063 declaring C names in headers.
3064 </p>
3065
3066 <p><i>[Sydney: This issue has been debated many times, and will
3067   certainly have to be discussed in full committee before any action
3068   can be taken.  However, the preliminary sentiment of the LWG was in
3069   favor of the change.  (6 yes, 0 no, 2 abstain) Robert Klarer
3070   suggests that we might also want to undeprecate the
3071   C-style <tt>.h</tt> headers.]</i></p>
3072
3073 <p><b>Proposed resolution:</b></p>
3074 <hr>
3075 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.random.access.iterators"> [lib.random.access.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Daniel Frey&nbsp; <b>Date:</b>&nbsp;27 Feb 2004</p>
3076 <p>
3077 In 24.1.5 [lib.random.access.iterators], table 76 the operational
3078 semantics for the expression "r -= n" are defined as "return r += -n".
3079 This means, that the expression -n must be valid, which is not the case
3080 for unsigned types. 
3081 </p>
3082
3083 <p><i>[
3084 Sydney: Possibly not a real problem, since difference type is required
3085 to be a signed integer type. However, the wording in the standard may
3086 be less clear than we would like.
3087 ]</i></p>
3088
3089 <p><b>Proposed resolution:</b></p>
3090 <p>
3091 To remove this limitation, I suggest to change the
3092 operational semantics for this column to:
3093 </p>
3094 <code>
3095     { Distance m = n; 
3096       if (m &gt;= 0) 
3097         while (m--) --r; 
3098       else 
3099         while (m++) ++r;
3100       return r; }
3101 </code>
3102
3103 <hr>
3104 <a name="459"></a><h3><a name="459">459.&nbsp;Requirement for widening in stage 2 is overspecification</a></h3><p><b>Section:</b>&nbsp;22.2.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.virtuals"> [lib.facet.num.get.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;16 Mar 2004</p>
3105 <p>When parsing strings of wide-character digits, the standard
3106   requires the library to widen narrow-character "atoms" and compare
3107   the widened atoms against the characters that are being parsed.
3108   Simply narrowing the wide characters would be far simpler, and
3109   probably more efficient.  The two choices are equivalent except in
3110   convoluted test cases, and many implementations already ignore the
3111   standard and use narrow instead of widen.</p>
3112
3113 <p>
3114 First, I disagree that using narrow() instead of widen() would
3115 necessarily have unfortunate performance implications. A possible
3116 implementation of narrow() that allows num_get to be implemented
3117 in a much simpler and arguably comparably efficient way as calling
3118 widen() allows, i.e. without making a virtual call to do_narrow every
3119 time, is as follows:
3120 </p>
3121
3122 <pre>  inline char ctype&lt;wchar_t&gt;::narrow (wchar_t wc, char dflt) const
3123   {
3124       const unsigned wi = unsigned (wc);
3125
3126       if (wi &gt; UCHAR_MAX)
3127           return typeid (*this) == typeid (ctype&lt;wchar_t&gt;) ?
3128                  dflt : do_narrow (wc, dflt);
3129
3130       if (narrow_ [wi] &lt; 0) {
3131          const char nc = do_narrow (wc, dflt);
3132          if (nc == dflt)
3133              return dflt;
3134          narrow_ [wi] = nc;
3135       }
3136
3137       return char (narrow_ [wi]);
3138   }
3139 </pre>
3140
3141 <p>
3142 Second, I don't think the change proposed in the issue (i.e., to use
3143 narrow() instead of widen() during Stage 2) would be at all
3144 drastic. Existing implementations with the exception of libstdc++
3145 currently already use narrow() so the impact of the change on programs
3146 would presumably be isolated to just a single implementation. Further,
3147 since narrow() is not required to translate alternate wide digit
3148 representations such as those mentioned in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#303">303</a> to
3149 their narrow equivalents (i.e., the portable source characters '0'
3150 through '9'), the change does not necessarily imply that these
3151 alternate digits would be treated as ordinary digits and accepted as
3152 part of numbers during parsing. In fact, the requirement in 22.2.1.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.virtuals"> [lib.locale.ctype.virtuals]</a>, p13 forbids narrow() to translate an alternate
3153 digit character, wc, to an ordinary digit in the basic source
3154 character set unless the expression
3155 (ctype&lt;charT&gt;::is(ctype_base::digit, wc) == true) holds. This in
3156 turn is prohibited by the C standard (7.25.2.1.5, 7.25.2.1.5, and
3157 5.2.1, respectively) for charT of either char or wchar_t.
3158 </p>
3159
3160 <p><i>[Sydney: To a large extent this is a nonproblem. As long as
3161 you're only trafficking in char and wchar_t we're only dealing with a
3162 stable character set, so you don't really need either 'widen' or
3163 'narrow': can just use literals. Finally, it's not even clear whether
3164 widen-vs-narrow is the right question; arguably we should be using
3165 codecvt instead.]</i></p>
3166
3167 <p><b>Proposed resolution:</b></p>
3168 <p>Change stage 2 so that implementations are permitted to use either
3169 technique to perform the comparison:</p>
3170 <ol>
3171   <li> call widen on the atoms and compare (either by using
3172       operator== or char_traits&lt;charT&gt;::eq) the input with
3173       the widened atoms, or</li>
3174   <li> call narrow on the input and compare the narrow input
3175       with the atoms</li>
3176   <li> do (1) or (2) only if charT is not char or wchar_t,
3177       respectively; i.e., avoid calling widen or narrow
3178       if it the source and destination types are the same</li>
3179 </ol>
3180 <hr>
3181 <a name="462"><h3>462.&nbsp;Destroying objects with static storage duration</h3></a><p><b>Section:</b>&nbsp;3.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/basic.html#basic.start.term"> [basic.start.term]</a>, 18.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.support.start.term"> [lib.support.start.term]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;23 Mar 2004</p>
3182 <p>
3183 3.6.3 Termination spells out in detail the interleaving of static
3184 destructor calls and calls to functions registered with atexit. To
3185 match this behavior requires intimate cooperation between the code
3186 that calls destructors and the exit/atexit machinery. The former
3187 is tied tightly to the compiler; the latter is a primitive mechanism
3188 inherited from C that traditionally has nothing to do with static
3189 construction and destruction. The benefits of intermixing destructor
3190 calls with atexit handler calls is questionable at best, and <i>very</i>
3191 difficult to get right, particularly when mixing third-party C++
3192 libraries with different third-party C++ compilers and C libraries
3193 supplied by still other parties.
3194 </p>
3195
3196 <p>
3197 I believe the right thing to do is defer all static destruction
3198 until after all atexit handlers are called. This is a change in
3199 behavior, but one that is likely visible only to perverse test
3200 suites. At the very least, we should <i>permit</i> deferred destruction
3201 even if we don't require it.
3202 </p>
3203 <p><b>Proposed resolution:</b></p>
3204
3205 <p><i>[If this is to be changed, it should probably be changed by CWG.
3206   At this point, however, the LWG is leaning toward NAD.  Implementing
3207   what the standard says is hard work, but it's not impossible and
3208   most vendors went through that pain years ago.  Changing this
3209   behavior would be a user-visible change, and would break at least
3210   one real application.]</i></p>
3211
3212 <p>
3213 </p>
3214 <hr>
3215 <a name="463"><h3>463.&nbsp;auto_ptr usability issues</h3></a><p><b>Section:</b>&nbsp;20.4.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr"> [lib.auto.ptr]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Rani Sharoni&nbsp; <b>Date:</b>&nbsp;7 Dec 2003</p>
3216
3217 <p>
3218 TC1 CWG DR #84 effectively made the template&lt;class Y&gt; operator auto_ptr&lt;Y&gt;()
3219 member of auto_ptr (20.4.5.3/4) obsolete.
3220 </p>
3221
3222 <p>
3223 The sole purpose of this obsolete conversion member is to enable copy
3224 initialization base from r-value derived (or any convertible types like
3225 cv-types) case:
3226 </p>
3227 <pre>#include &lt;memory&gt;
3228 using std::auto_ptr;
3229
3230 struct B {};
3231 struct D : B {};
3232
3233 auto_ptr&lt;D&gt; source();
3234 int sink(auto_ptr&lt;B&gt;);
3235 int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
3236 </pre>
3237
3238 <p>
3239 The excellent analysis of conversion operations that was given in the final
3240 auto_ptr proposal
3241 (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf)
3242 explicitly specifies this case analysis (case 4). DR #84 makes the analysis
3243 wrong and actually comes to forbid the loophole that was exploited by the
3244 auto_ptr designers.
3245 </p>
3246
3247 <p>
3248 I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that
3249 ever allowed this case. This is probably because it requires 3 user defined
3250 conversions and in fact current compilers conform to DR #84.
3251 </p>
3252
3253 <p>
3254 I was surprised to discover that the obsolete conversion member actually has
3255 negative impact of the copy initialization base from l-value derived
3256 case:</p>
3257 <pre>auto_ptr&lt;D&gt; dp;
3258 int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
3259 </pre>
3260
3261 <p>
3262 I'm sure that the original intention was allowing this initialization using
3263 the template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt;&amp; a) constructor (20.4.5.1/4) but
3264 since in this copy initialization it's merely user defined conversion (UDC)
3265 and the obsolete conversion member is UDC with the same rank (for the early
3266 overloading stage) there is an ambiguity between them.
3267 </p>
3268
3269 <p>
3270 Removing the obsolete member will have impact on code that explicitly
3271 invokes it:
3272 </p>
3273 <pre>int y = sink(source().operator auto_ptr&lt;B&gt;());
3274 </pre>
3275
3276 <p>
3277 IMHO no one ever wrote such awkward code and the reasonable workaround for
3278 #1 is:
3279 </p>
3280 <pre>int y = sink( auto_ptr&lt;B&gt;(source()) );
3281 </pre>
3282
3283 <p>
3284 I was even more surprised to find out that after removing the obsolete
3285 conversion member the initialization was still ill-formed:
3286 int x3 = sink(dp); // #3 EDG - no suitable copy constructor
3287 </p>
3288
3289 <p>
3290 This copy initialization semantically requires copy constructor which means
3291 that both template conversion constructor and the auto_ptr_ref conversion
3292 member (20.4.5.3/3) are required which is what was explicitly forbidden in
3293 DR #84. This is a bit amusing case in which removing ambiguity results with
3294 no candidates.
3295 </p>
3296
3297 <p>
3298 I also found exception safety issue with auto_ptr related to auto_ptr_ref:
3299 </p>
3300 <pre>int f(auto_ptr&lt;B&gt;, std::string);
3301 auto_ptr&lt;B&gt; source2();
3302
3303 // string constructor throws while auto_ptr_ref
3304 // "holds" the pointer
3305 int x4 = f(source2(), "xyz"); // #4
3306 </pre>
3307
3308 <p>
3309 The theoretic execution sequence that will cause a leak:
3310 </p>
3311 <ol>
3312 <li>call auto_ptr&lt;B&gt;::operator auto_ptr_ref&lt;B&gt;()</li>
3313 <li>call string::string(char const*) and throw</li>
3314 </ol>
3315
3316 <p>
3317 According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member
3318 returns auto_ptr_ref&lt;Y&gt; that holds *this and this is another defect since
3319 the type of *this is auto_ptr&lt;X&gt; where X might be different from Y. Several
3320 library vendors (e.g. SGI) implement auto_ptr_ref&lt;Y&gt; with Y* as member which
3321 is much more reasonable. Other vendor implemented auto_ptr_ref as
3322 defectively required and it results with awkward and catastrophic code:
3323 int oops = sink(auto_ptr&lt;B&gt;(source())); // warning recursive on all control
3324 paths
3325 </p>
3326
3327 <p>
3328 Dave Abrahams noticed that there is no specification saying that
3329 auto_ptr_ref copy constructor can't throw.
3330 </p>
3331
3332 <p>
3333 My proposal comes to solve all the above issues and significantly simplify
3334 auto_ptr implementation. One of the fundamental requirements from auto_ptr
3335 is that it can be constructed in an intuitive manner (i.e. like ordinary
3336 pointers) but with strict ownership semantics which yield that source
3337 auto_ptr in initialization must be non-const. My idea is to add additional
3338 constructor template with sole propose to generate ill-formed, diagnostic
3339 required, instance for const auto_ptr arguments during instantiation of
3340 declaration. This special constructor will not be instantiated for other
3341 types which is achievable using 14.8.2/2 (SFINAE). Having this constructor
3342 in hand makes the constructor template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp;)
3343 legitimate since the actual argument can't be const yet non const r-value
3344 are acceptable.
3345 </p>
3346
3347 <p>
3348 This implementation technique makes the "private auxiliary class"
3349 auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG,
3350 GCC and VC) consume the new implementation as expected and allow all
3351 intuitive initialization and assignment cases while rejecting illegal cases
3352 that involve const auto_ptr arguments.
3353 </p>
3354
3355 <p>The proposed auto_ptr interface:</p>
3356
3357 <pre>namespace std {
3358     template&lt;class X&gt; class auto_ptr {
3359     public:
3360         typedef X element_type;
3361
3362         // 20.4.5.1 construct/copy/destroy:
3363         explicit auto_ptr(X* p=0) throw();
3364         auto_ptr(auto_ptr&amp;) throw();
3365         template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp;) throw();
3366         auto_ptr&amp; operator=(auto_ptr&amp;) throw();
3367         template&lt;class Y&gt; auto_ptr&amp; operator=(auto_ptr&lt;Y&gt;) throw();
3368         ~auto_ptr() throw();
3369
3370         // 20.4.5.2 members:
3371         X&amp; operator*() const throw();
3372         X* operator-&gt;() const throw();
3373         X* get() const throw();
3374         X* release() throw();
3375         void reset(X* p=0) throw();
3376
3377     private:
3378         template&lt;class U&gt;
3379         auto_ptr(U&amp; rhs, typename
3380 unspecified_error_on_const_auto_ptr&lt;U&gt;::type = 0);
3381     };
3382 }
3383 </pre>
3384
3385 <p>
3386 One compliant technique to implement the unspecified_error_on_const_auto_ptr
3387 helper class is using additional private auto_ptr member class template like
3388 the following:
3389 </p>
3390 <pre>template&lt;typename T&gt; struct unspecified_error_on_const_auto_ptr;
3391
3392 template&lt;typename T&gt;
3393 struct unspecified_error_on_const_auto_ptr&lt;auto_ptr&lt;T&gt; const&gt;
3394 { typedef typename auto_ptr&lt;T&gt;::const_auto_ptr_is_not_allowed type; };
3395 </pre>
3396
3397 <p>
3398 There are other techniques to implement this helper class that might work
3399 better for different compliers (i.e. better diagnostics) and therefore I
3400 suggest defining its semantic behavior without mandating any specific
3401 implementation. IMO, and I didn't found any compiler that thinks otherwise,
3402 14.7.1/5 doesn't theoretically defeat the suggested technique but I suggest
3403 verifying this with core language experts.
3404 </p>
3405
3406 <p><b>Further changes in standard text:</b></p>
3407 <p>Remove section 20.4.5.3</p>
3408
3409 <p>Change 20.4.5/2 to read something like:
3410 Initializing auto_ptr&lt;X&gt; from const auto_ptr&lt;Y&gt; will result with unspecified
3411 ill-formed declaration that will require unspecified diagnostic.</p>
3412
3413 <p>Change 20.4.5.1/4,5,6 to read:</p>
3414
3415 <pre>template&lt;class Y&gt; auto_ptr(auto_ptr&lt;Y&gt; const&amp; a) throw();</pre>
3416 <p> 4 Requires: Y* can be implicitly converted to X*.</p>
3417 <p> 5 Effects: Calls const_cast&lt;auto_ptr&lt;Y&gt;&amp;&gt;(a).release().</p>
3418 <p> 6 Postconditions: *this holds the pointer returned from a.release().</p>
3419
3420 <p>Change 20.4.5.1/10</p>
3421 <pre>template&lt;class Y&gt; auto_ptr&amp; operator=(auto_ptr&lt;Y&gt; a) throw();
3422 </pre>
3423 <p>
3424 10 Requires: Y* can be implicitly converted to X*. The expression delete
3425 get() is well formed.
3426 </p>
3427
3428 <p>LWG TC DR #127 is obsolete.</p>
3429
3430 <p>
3431 Notice that the copy constructor and copy assignment operator should remain
3432 as before and accept non-const auto_ptr&amp; since they have effect on the form
3433 of the implicitly declared copy constructor and copy assignment operator of
3434 class that contains auto_ptr as member per 12.8/5,10:
3435 </p>
3436 <pre>struct X {
3437     // implicit X(X&amp;)
3438     // implicit X&amp; operator=(X&amp;)
3439     auto_ptr&lt;D&gt; aptr_;
3440 };
3441 </pre>
3442
3443 <p>
3444 In most cases this indicates about sloppy programming but preserves the
3445 current auto_ptr behavior.
3446 </p>
3447
3448 <p>
3449 Dave Abrahams encouraged me to suggest fallback implementation in case that
3450 my suggestion that involves removing of auto_ptr_ref will not be accepted.
3451 In this case removing the obsolete conversion member to auto_ptr&lt;Y&gt; and
3452 20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal
3453 cases. The two constructors that I suggested will co exist with the current
3454 members but will make auto_ptr_ref obsolete in initialization contexts.
3455 auto_ptr_ref will be effective in assignment contexts as suggested in DR
3456 #127 and I can't see any serious exception safety issues in those cases
3457 (although it's possible to synthesize such). auto_ptr_ref&lt;X&gt; semantics will
3458 have to be revised to say that it strictly holds pointer of type X and not
3459 reference to an auto_ptr for the favor of cases in which auto_ptr_ref&lt;Y&gt; is
3460 constructed from auto_ptr&lt;X&gt; in which X is different from Y (i.e. assignment
3461 from r-value derived to base).
3462 </p>
3463
3464 <p><b>Proposed resolution:</b></p>
3465 <p><i>[Redmond: punt for the moment. We haven't decided yet whether we
3466   want to fix auto_ptr for C++-0x, or remove it and replace it with
3467   move_ptr and unique_ptr.]</i></p>
3468 <hr>
3469 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Daniel Frey&nbsp; <b>Date:</b>&nbsp;10 Jun 2004</p>
3470 <p>
3471 Today, my colleagues and me wasted a lot of time. After some time, I
3472 found the problem. It could be reduced to the following short example:
3473 </p>
3474
3475 <pre>  #include &lt;string&gt;
3476   int main() { std::string( 0 ); }
3477 </pre>
3478
3479 <p>The problem is that the tested compilers (GCC 2.95.2, GCC 3.3.1 and
3480 Comeau online) compile the above without errors or warnings! The
3481 programs (at least for the GCC) resulted in a SEGV.</p>
3482
3483 <p>I know that the standard explicitly states that the ctor of string
3484 requires a char* which is not zero. STLs could easily detect the above
3485 case with a private ctor for basic_string which takes a single 'int'
3486 argument. This would catch the above code at compile time and would not
3487 ambiguate any other legal ctors.</p>
3488
3489 <p><b>Proposed resolution:</b></p>
3490 <p><i>[Redmond: No great enthusiasm for doing this.  If we do,
3491   however, we want to do it for all places that take <tt>charT*</tt>
3492   pointers, not just the single-argument constructor.  The other
3493   question is whether we want to catch this at compile time (in which
3494   case we catch the error of a literal 0, but not an expression whose
3495   value is a null pointer), at run time, or both.]</i></p>
3496
3497 <hr>
3498 <a name="470"><h3>470.&nbsp;accessing containers from their elements' special functions</h3></a><p><b>Section:</b>&nbsp;23 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.containers"> [lib.containers]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jun 2004</p>
3499
3500 <p>
3501 The standard doesn't prohibit the destructors (or any other special
3502 functions) of containers' elements invoked from a member function
3503 of the container from "recursively" calling the same (or any other)
3504 member function on the same container object, potentially while the
3505 container is in an intermediate state, or even changing the state
3506 of the container object while it is being modified. This may result
3507 in some surprising (i.e., undefined) behavior.
3508 </p>
3509
3510 <p>Read email thread starting with c++std-lib-13637 for more.</p>
3511
3512 <p><b>Proposed resolution:</b></p>
3513
3514 <p>Add to Container Requirements the following new paragraph:</p>
3515
3516 <pre>    Unless otherwise specified, the behavior of a program that
3517     invokes a container member function f from a member function
3518     g of the container's value_type on a container object c that
3519     called g from its mutating member function h, is undefined.
3520     I.e., if v is an element of c, directly or indirectly calling
3521     c.h() from v.g() called from c.f(), is undefined.
3522 </pre>
3523
3524 <p><i>[Redmond: This is a real issue, but it's probably a clause 17
3525   issue, not clause 23.  We get the same issue, for example, if we
3526   try to destroy a stream from one of the stream's callback functions.]</i></p>
3527   
3528
3529 <hr>
3530 <a name="471"><h3>471.&nbsp;result of what() implementation-defined</h3></a><p><b>Section:</b>&nbsp;18.6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.exception"> [lib.exception]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jun 2004</p>
3531
3532 <p>[lib.exception] specifies the following:</p>
3533 <pre>    exception (const exception&amp;) throw();
3534     exception&amp; operator= (const exception&amp;) throw();
3535
3536     -4- Effects: Copies an exception object.
3537     -5- Notes: The effects of calling what() after assignment
3538         are implementation-defined.
3539 </pre>
3540
3541 <p>
3542 First, does the Note only apply to the assignment operator? If so,
3543 what are the effects of calling what() on a copy of an object? Is
3544 the returned pointer supposed to point to an identical copy of
3545 the NTBS returned by what() called on the original object or not?
3546 </p>
3547
3548 <p>
3549 Second, is this Note intended to extend to all the derived classes
3550 in section 19? I.e., does the standard provide any guarantee for
3551 the effects of what() called on a copy of any of the derived class
3552 described in section 19?
3553 </p>
3554
3555 <p>
3556 Finally, if the answer to the first question is no, I believe it
3557 constitutes a defect since throwing an exception object typically
3558 implies invoking the copy ctor on the object. If the answer is yes,
3559 then I believe the standard ought to be clarified to spell out
3560 exactly what the effects are on the copy (i.e., after the copy
3561 ctor was called).
3562 </p>
3563
3564 <p><i>[Redmond: Yes, this is fuzzy.  The issue of derived classes is
3565   fuzzy too.]</i></p>
3566
3567 <p><b>Proposed resolution:</b></p>
3568 <hr>
3569 <a name="473"><h3>473.&nbsp;underspecified ctype calls</h3></a><p><b>Section:</b>&nbsp;22.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype"> [lib.locale.ctype]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;1 Jul 2004</p>
3570 <p>
3571 Most ctype member functions come in two forms: one that operates
3572 on a single character at a time and another form that operates
3573 on a range of characters. Both forms are typically described by
3574 a single Effects and/or Returns clause.
3575 </p>
3576 <p>
3577 The Returns clause of each of the single-character non-virtual forms
3578 suggests that the function calls the corresponding single character
3579 virtual function, and that the array form calls the corresponding
3580 virtual array form. Neither of the two forms of each virtual member
3581 function is required to be implemented in terms of the other.
3582 </p>
3583 <p>
3584 There are three problems:
3585 </p>
3586 <p>
3587 1. One is that while the standard does suggest that each non-virtual
3588 member function calls the corresponding form of the virtual function,
3589 it doesn't actually explicitly require it.
3590 </p>
3591 <p>
3592 Implementations that cache results from some of the virtual member
3593 functions for some or all values of their arguments might want to
3594 call the array form from the non-array form the first time to fill
3595 the cache and avoid any or most subsequent virtual calls. Programs
3596 that rely on each form of the virtual function being called from
3597 the corresponding non-virtual function will see unexpected behavior
3598 when using such implementations.
3599 </p>
3600 <p>
3601 2. The second problem is that either form of each of the virtual
3602 functions can be overridden by a user-defined function in a derived
3603 class to return a value that is different from the one produced by
3604 the virtual function of the alternate form that has not been
3605 overriden.
3606 </p>
3607 <p>
3608 Thus, it might be possible for, say, ctype::widen(c) to return one
3609 value, while for ctype::widen(&amp;c, &amp;c + 1, &amp;wc) to set
3610 wc to another value. This is almost certainly not intended. Both
3611 forms of every function should be required to return the same result
3612 for the same character, otherwise the same program using an
3613 implementation that calls one form of the functions will behave
3614 differently than when using another implementation that calls the
3615 other form of the function "under the hood."
3616 </p>
3617 <p>
3618 3. The last problem is that the standard text fails to specify whether
3619 one form of any of the virtual functions is permitted to be implemented
3620 in terms of the other form or not, and if so, whether it is required
3621 or permitted to call the overridden virtual function or not.
3622 </p>
3623 <p>
3624 Thus, a program that overrides one of the virtual functions so that
3625 it calls the other form which then calls the base member might end
3626 up in an infinite loop if the called form of the base implementation
3627 of the function in turn calls the other form.
3628 </p>
3629 <p><b>Proposed resolution:</b></p>
3630
3631 <p>
3632 Lillehammer: Part of this isn't a real problem. We already talk about
3633 caching. 22.1.1/6 But part is a real problem. ctype virtuals may call
3634 each other, so users don't know which ones to override to avoid avoid
3635 infinite loops.</p>
3636
3637 <p>This is a problem for all facet virtuals, not just ctype virtuals,
3638 so we probably want a blanket statement in clause 22 for all
3639 facets. The LWG is leaning toward a blanket prohibition, that a
3640 facet's virtuals may never call each other. We might want to do that
3641 in clause 27 too, for that matter. A review is necessary.  Bill will
3642 provide wording.</p>
3643 <hr>
3644 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.foreach"> [lib.alg.foreach]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Stephan T. Lavavej, Jaakko Jarvi&nbsp; <b>Date:</b>&nbsp;9 Jul 2004</p>
3645 <p>
3646 It is not clear whether the function object passed to for_each is allowed to
3647 modify the elements of the sequence being iterated over.
3648 </p>
3649
3650 <p>
3651 for_each is classified without explanation in [lib.alg.nonmodifying], "25.1
3652 Non-modifying sequence operations". 'Non-modifying sequence operation' is
3653 never defined.
3654 </p>
3655
3656 <p>
3657 25(5) says: "If an algorithm's Effects section says that a value pointed to
3658 by any iterator passed as an argument is modified, then that algorithm has
3659 an additional type requirement: The type of that argument shall satisfy the
3660 requirements of a mutable iterator (24.1)."
3661 </p>
3662
3663 <p>for_each's Effects section does not mention whether arguments can be
3664 modified:</p>
3665
3666 <blockquote>
3667   "Effects: Applies f to the result of dereferencing every iterator in the
3668    range [first, last), starting from first and proceeding to last - 1."
3669 </blockquote>
3670
3671 <p>
3672 Every other algorithm in [lib.alg.nonmodifying] is "really" non-modifying in
3673 the sense that neither the algorithms themselves nor the function objects
3674 passed to the algorithms may modify the sequences or elements in any way.
3675 This DR affects only for_each.
3676 </p>
3677
3678 <p>
3679 We suspect that for_each's classification in "non-modifying sequence
3680 operations" means that the algorithm itself does not inherently modify the
3681 sequence or the elements in the sequence, but that the function object
3682 passed to it may modify the elements it operates on. 
3683 </p>
3684
3685 <p>
3686 The original STL document by Stepanov and Lee explicitly prohibited the
3687 function object from modifying its argument.
3688 The "obvious" implementation of for_each found in several standard library 
3689 implementations, however, does not impose this restriction.
3690 As a result, we suspect that the use of for_each with function objects that modify
3691 their arguments is wide-spread. 
3692 If the restriction was reinstated, all such code would become non-conforming.
3693 Further, none of the other algorithms in the Standard
3694 could serve the purpose of for_each (transform does not guarantee the order in
3695 which its function object is called). 
3696 </p>
3697
3698 <p>
3699 We suggest that the standard be clarified to explicitly allow the function object 
3700 passed to for_each modify its argument.</p>
3701
3702 <p><b>Proposed resolution:</b></p>
3703 <p>Add a nonnormative note to the Effects in 25.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.foreach"> [lib.alg.foreach]</a>: If
3704 the type of 'first' satisfies the requirements of a mutable iterator,
3705 'f' may apply nonconstant functions through the dereferenced iterators
3706 passed to it.
3707 </p>
3708
3709 <p><b>Rationale:</b></p>
3710 <p>The LWG believes that nothing in the standard prohibits function
3711   objects that modify the sequence elements. The problem is that
3712   for_each is in a secion entitled "nonmutating algorithms", and the
3713   title may be confusing.  A nonnormative note should clarify that.</p>
3714 <hr>
3715 <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="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.forward.iterators"> [lib.forward.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;11 Jul 2004</p>
3716 <p>
3717 The Forward Iterator requirements table contains the following:
3718 </p>
3719 <pre> expression  return type         operational  precondition
3720                                   semantics
3721   ==========  ==================  ===========  ==========================
3722   a-&gt;m        U&amp; if X is mutable, (*a).m       pre: (*a).m is well-defined.
3723               otherwise const U&amp;
3724
3725   r-&gt;m        U&amp;                  (*r).m       pre: (*r).m is well-defined.
3726 </pre>
3727
3728 <p>The second line may be unnecessary.  Paragraph 11 of
3729   [lib.iterator.requirements] says:
3730 </p>
3731
3732 <blockquote>
3733    In the following sections, a and b denote values of type const X, n
3734    denotes a value of the difference type Distance, u, tmp, and m
3735    denote identifiers, r denotes a value of X&amp;, t denotes a value of
3736    value type T, o denotes a value of some type that is writable to
3737    the output iterator.
3738 </blockquote>
3739
3740 <p>
3741 Because operators can be overloaded on an iterator's const-ness, the
3742 current requirements allow iterators to make many of the operations
3743 specified using the identifiers a and b invalid for non-const
3744 iterators.</p>
3745
3746 <p>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#477">477</a></p>
3747 <p><b>Proposed resolution:</b></p>
3748
3749 <p>Remove the "r-&gt;m" line from the Forward Iterator requirements
3750 table. Change</p>
3751 <blockquote>
3752     "const X"
3753 </blockquote>
3754
3755 <p> to </p>
3756
3757 <blockquote>
3758     "X or const X" 
3759 </blockquote>
3760
3761 <p>in paragraph 11 of [lib.iterator.requirements].</p>
3762
3763
3764 <p><b>Rationale:</b></p>
3765 <p>
3766 This is a defect because it constrains an lvalue to returning a modifiable lvalue.
3767 </p>
3768 <hr>
3769 <a name="479"><h3>479.&nbsp;Container requirements and placement new</h3></a><p><b>Section:</b>&nbsp;23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Herb Sutter&nbsp; <b>Date:</b>&nbsp;1 Aug 2004</p>
3770 <p>Nothing in the standard appears to make this program ill-formed:</p>
3771
3772 <pre>  struct C {
3773     void* operator new( size_t s ) { return ::operator new( s ); }
3774     // NOTE: this hides in-place and nothrow new
3775   };
3776
3777   int main() {
3778     vector&lt;C&gt; v;
3779     v.push_back( C() );
3780   }
3781 </pre>
3782
3783 <p>Is that intentional?  We should clarify whether or not we intended
3784   to require containers to support types that define their own special
3785   versions of <tt>operator new</tt>.</p>
3786
3787 <p><i>[
3788 Lillehammer: A container will definitely never use this overridden
3789 operator new, but whether it will fail to compile is unclear from the
3790 standard.  Are containers supposed to use qualified or unqualified
3791 placement new?  20.4.1.1 is somewhat relevant, but the standard
3792 doesn't make it completely clear whether containers have to use
3793 Allocator::construct(). If containers don't use it, the details of how
3794 containers use placement new are unspecified. That is the real bug,
3795 but it needs to be fixed as part of the allocator overhaul.  Weak
3796 support that the eventual solution should make this code well formed.
3797 ]</i></p>
3798
3799 <p><b>Proposed resolution:</b></p>
3800 <hr>
3801 <a name="482"><h3>482.&nbsp;Swapping pairs</h3></a><p><b>Section:</b>&nbsp;20.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.pairs"> [lib.pairs]</a>, 25.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.swap"> [lib.alg.swap]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;14 Sep 2004</p>
3802 <p>(Based on recent comp.std.c++ discussion)</p>
3803
3804 <p>Pair (and tuple) should specialize std::swap to work in terms of
3805 std::swap on their components.  For example, there's no obvious reason
3806 why swapping two objects of type pair&lt;vector&lt;int&gt;,
3807 list&lt;double&gt; &gt; should not take O(1).</p>
3808 <p><b>Proposed resolution:</b></p>
3809
3810
3811 <p><i>[Lillehammer: We agree it should be swappable.  Howard will
3812   provide wording.]</i></p>
3813
3814 <hr>
3815 <a name="484"><h3>484.&nbsp;Convertible to T</h3></a><p><b>Section:</b>&nbsp;24.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.input.iterators"> [lib.input.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Chris&nbsp; <b>Date:</b>&nbsp;16 Sep 2004</p>
3816 <p>From comp.std.c++:</p>
3817
3818 <p>
3819 I note that given an input iterator a for type T, 
3820 then *a only has to be "convertable to T", not actually of type T.
3821 </p>
3822
3823 <p>Firstly, I can't seem to find an exact definition of "convertable to T". 
3824 While I assume it is the obvious definition (an implicit conversion), I 
3825 can't find an exact definition. Is there one?</p>
3826
3827 <p>Slightly more worryingly, there doesn't seem to be any restriction on 
3828 the this type, other than it is "convertable to T". Consider two input 
3829 iterators a and b. I would personally assume that most people would 
3830 expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that 
3831 the standard requires that, and that whatever type *a is (call it U) 
3832 could have == defined on it with totally different symantics and still 
3833 be a valid inputer iterator.</p>
3834
3835 <p>Is this a correct reading? When using input iterators should I write 
3836 T(*a) all over the place to be sure that the object i'm using is the 
3837 class I expect?</p>
3838
3839 <p>This is especially a nuisance for operations that are defined to be
3840   "convertible to bool".  (This is probably allowed so that
3841   implementations could return say an int and avoid an unnessary
3842   conversion. However all implementations I have seen simply return a
3843   bool anyway.  Typical implemtations of STL algorithms just write
3844   things like <tt>while(a!=b &amp;&amp; *a!=0)</tt>.  But strictly
3845   speaking, there are lots of types that are convertible to T but
3846   that also overload the appropriate operators so this doesn't behave
3847   as expected.</p>
3848
3849 <p>If we want to make code like this legal (which most people seem to
3850   expect), then we'll need to tighten up what we mean by "convertible
3851   to T".</p>
3852
3853 <p><b>Proposed resolution:</b></p>
3854 <p><i>[Lillehammer: The first part is NAD, since "convertible" is
3855  well-defined in core. The second part is basically about pathological
3856  overloads. It's a minor problem but a real one. So leave open for
3857  now, hope we solve it as part of iterator redesign.]</i></p>
3858 <hr>
3859 <a name="485"><h3>485.&nbsp;output iterator insufficently constrained</h3></a><p><b>Section:</b>&nbsp;24.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.output.iterators"> [lib.output.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Chris&nbsp; <b>Date:</b>&nbsp;13 Oct 2004</p>
3860 <p>
3861 The note on 24.1.2 Output iterators insufficently limits what can be
3862 performed on output iterators. While it requires that each iterator is
3863 progressed through only once and that each iterator is written to only
3864 once, it does not require the following things:</p>
3865
3866 <p>Note: Here it is assumed that x is an output iterator of type X which
3867 has not yet been assigned to.</p>
3868
3869 <p>a) That each value of the output iterator is written to:
3870 The standard allows:
3871 ++x; ++x; ++x;
3872 </p>
3873
3874 <p>
3875 b) That assignments to the output iterator are made in order
3876 X a(x); ++a; *a=1; *x=2; is allowed
3877 </p>
3878
3879 <p>
3880 c) Chains of output iterators cannot be constructed:
3881 X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current
3882 wording (I believe) x,a,b,c could be written to in any order.
3883 </p>
3884
3885 <p>I do not believe this was the intension of the standard?</p>
3886 <p><b>Proposed resolution:</b></p>
3887 <p><i>[Lillehammer: Real issue.  There are lots of constraints we
3888   intended but didn't specify.  Should be solved as part of iterator
3889   redesign.]</i></p>
3890 <hr>
3891 <a name="488"><h3>488.&nbsp;rotate throws away useful information</h3></a><p><b>Section:</b>&nbsp;25.2.10 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.rotate"> [lib.alg.rotate]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;22 Nov 2004</p>
3892 <p>
3893 rotate takes 3 iterators:  first, middle and last which point into a
3894 sequence, and rearranges the sequence such that the subrange [middle,
3895 last) is now at the beginning of the sequence and the subrange [first,
3896 middle) follows.  The return type is void. 
3897 </p>
3898
3899 <p>
3900 In many use cases of rotate, the client needs to know where the
3901 subrange [first, middle) starts after the rotate is performed.  This
3902 might look like: 
3903 </p>
3904 <pre>  rotate(first, middle, last);
3905   Iterator i = advance(first, distance(middle, last));
3906 </pre>
3907
3908 <p>
3909 Unless the iterators are random access, the computation to find the
3910 start of the subrange [first, middle) has linear complexity.  However,
3911 it is not difficult for rotate to return this information with
3912 negligible additional computation expense.  So the client could code: 
3913 </p>
3914 <pre>  Iterator i = rotate(first, middle, last);
3915 </pre>
3916
3917 <p>
3918 and the resulting program becomes significantly more efficient.
3919 </p>
3920
3921 <p>
3922 While the backwards compatibility hit with this change is not zero, it
3923 is very small (similar to that of lwg <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130">130</a>), and there is
3924 a significant benefit to the change. 
3925 </p>
3926
3927 <p><b>Proposed resolution:</b></p>
3928 <p>In 25p2, change:</p>
3929 <pre>  template&lt;class ForwardIterator&gt;
3930     void rotate(ForwardIterator first, ForwardIterator middle,
3931                 ForwardIterator last);
3932 </pre>
3933
3934 <p>to:</p>
3935
3936 <pre>  template&lt;class ForwardIterator&gt;
3937     ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
3938                            ForwardIterator last);
3939 </pre>
3940
3941 <p>In 25.2.10, change:</p>
3942
3943 <pre>  template&lt;class ForwardIterator&gt;
3944     void rotate(ForwardIterator first, ForwardIterator middle,
3945                 ForwardIterator last);
3946 </pre>
3947
3948 <p>to:</p>
3949
3950 <pre>  template&lt;class ForwardIterator&gt;
3951     ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
3952                            ForwardIterator last);
3953 </pre>
3954
3955 <p>In 25.2.10 insert a new paragraph after p1:</p>
3956
3957 <blockquote>
3958 <p><b>Returns</b>: <tt>first + (last - middle)</tt>.</p>
3959 </blockquote>
3960
3961 <p><i>[
3962 The LWG agrees with this idea, but has one quibble: we want to make
3963 sure not to give the impression that the function "advance" is
3964 actually called, just that the nth iterator is returned.  (Calling
3965 advance is observable behavior, since users can specialize it for
3966 their own iterators.)  Howard will provide wording.
3967 ]</i></p>
3968
3969 <p><i>[Howard provided wording for mid-meeting-mailing Jun. 2005.]</i></p>
3970
3971 <hr>
3972 <a name="492"><h3>492.&nbsp;Invalid iterator arithmetic expressions</h3></a><p><b>Section:</b>&nbsp;23 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.containers"> [lib.containers]</a>, 24 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterators"> [lib.iterators]</a>, 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Thomas Mang&nbsp; <b>Date:</b>&nbsp;12 Dec 2004</p>
3973 <p>Various clauses other than clause 25 make use of iterator arithmetic not
3974 supported by the iterator category in question.
3975 Algorithms in clause 25 are exceptional because of 25 [lib.algorithms],
3976 paragraph 9, but this paragraph does not provide semantics to the
3977 expression "iterator - n", where n denotes a value of a distance type
3978 between iterators.</p>
3979
3980 <p>1) Examples of current wording:</p>
3981
3982 <p>Current wording outside clause 25:</p>
3983
3984 <p>
3985 23.2.2.4 [lib.list.ops], paragraphs 19-21: "first + 1", "(i - 1)",
3986 "(last - first)"
3987 23.3.1.1 [lib.map.cons], paragraph 4: "last - first"
3988 23.3.2.1 [lib.multimap.cons], paragraph 4: "last - first"
3989 23.3.3.1 [lib.set.cons], paragraph 4: "last - first"
3990 23.3.4.1 [lib.multiset.cons], paragraph 4: "last - first"
3991 24.4.1 [lib.reverse.iterators], paragraph 1: "(i - 1)"
3992 </p>
3993
3994 <p>
3995 [Important note: The list is not complete, just an illustration. The
3996 same issue might well apply to other paragraphs not listed here.]</p>
3997
3998 <p>None of these expressions is valid for the corresponding iterator
3999 category.</p>
4000
4001 <p>Current wording in clause 25:</p>
4002
4003 <p>
4004 25.1.1 [lib.alg.foreach], paragraph 1: "last - 1"
4005 25.1.3 [lib.alg.find.end], paragraph 2: "[first1, last1 -
4006 (last2-first2))"
4007 25.2.8 [lib.alg.unique], paragraph 1: "(i - 1)"
4008 25.2.8 [lib.alg.unique], paragraph 5: "(i - 1)"
4009 </p>
4010
4011 <p>
4012 However, current wording of 25 [lib.algorithms], paragraph 9 covers
4013 neither of these four cases:</p>
4014
4015 <p>Current wording of 25 [lib.algorithms], paragraph 9:</p>
4016
4017 <p>
4018 "In the description of the algorithms operator + and - are used for some
4019 of the iterator categories for which they do not have to be defined. In
4020 these cases the semantics of a+n is the same as that of</p>
4021 <pre>{X tmp = a;
4022 advance(tmp, n);
4023 return tmp;
4024 }
4025 </pre>
4026 <p>and that of b-a is the same as of return distance(a, b)"</p>
4027
4028 <p>
4029 This paragrpah does not take the expression "iterator - n" into account,
4030 where n denotes a value of a distance type between two iterators [Note:
4031 According to current wording, the expression "iterator - n" would be
4032 resolved as equivalent to "return distance(n, iterator)"]. Even if the
4033 expression "iterator - n" were to be reinterpreted as equivalent to
4034 "iterator + -n" [Note: This would imply that "a" and "b" were
4035 interpreted implicitly as values of iterator types, and "n" as value of
4036 a distance type], then 24.3.4/2 interfers because it says: "Requires: n
4037 may be negative only for random access and bidirectional iterators.",
4038 and none of the paragraphs quoted above requires the iterators on which
4039 the algorithms operate to be of random access or bidirectional category.
4040 </p>
4041
4042 <p>2) Description of intended behavior:</p>
4043
4044 <p>
4045 For the rest of this Defect Report, it is assumed that the expression
4046 "iterator1 + n" and "iterator1 - iterator2" has the semantics as
4047 described in current 25 [lib.algorithms], paragraph 9, but applying to
4048 all clauses. The expression "iterator1 - n" is equivalent to an
4049 result-iterator for which the expression "result-iterator + n" yields an
4050 iterator denoting the same position as iterator1 does. The terms
4051 "iterator1", "iterator2" and "result-iterator" shall denote the value of
4052 an iterator type, and the term "n" shall denote a value of a distance
4053 type between two iterators.</p>
4054
4055 <p>
4056 All implementations known to the author of this Defect Report comply
4057 with these assumptions.
4058 No impact on current code is expected.</p>
4059
4060 <p>3) Proposed fixes:</p>
4061
4062
4063 <p>Change 25 [lib.algorithms], paragraph 9 to:</p>
4064
4065 <p>
4066 "In the description of the algorithms operator + and - are used for some
4067 of the iterator categories for which they do not have to be defined. In
4068 this paragraph, a and b denote values of an iterator type, and n denotes
4069 a value of a distance type between two iterators. In these cases the
4070 semantics of a+n is the same as that of</p>
4071 <pre>{X tmp = a;
4072 advance(tmp, n);
4073 return tmp;
4074 }
4075 </pre>
4076 <p>,the semantics of a-n denotes the value of an iterator i for which the
4077 following condition holds:
4078 advance(i, n) == a,
4079 and that of b-a is the same as of
4080 return distance(a, b)".
4081 </p>
4082
4083 <p>Comments to the new wording:</p>
4084
4085 <p>
4086 a) The wording " In this paragraph, a and b denote values of an iterator
4087 type, and n denotes a value of a distance type between two iterators."
4088 was added so the expressions "b-a" and "a-n" are distinguished regarding
4089 the types of the values on which they operate.
4090 b) The wording ",the semantics of a-n denotes the value of an iterator i
4091 for which the following condition holds: advance(i, n) == a" was added
4092 to cover the expression 'iterator - n'. The wording "advance(i, n) == a"
4093 was used to avoid a dependency on the semantics of a+n, as the wording
4094 "i + n == a" would have implied. However, such a dependency might well
4095 be deserved.
4096 c) DR 225 is not considered in the new wording.
4097 </p>
4098
4099 <p>
4100 Proposed fixes regarding invalid iterator arithmetic expressions outside
4101 clause 25:</p>
4102
4103 <p>
4104 Either
4105 a) Move modified 25 [lib.algorithms], paragraph 9 (as proposed above)
4106 before any current invalid iterator arithmetic expression. In that case,
4107 the first sentence of 25 [lib.algorithms], paragraph 9, need also to be
4108 modified and could read: "For the rest of this International Standard,
4109 ...." / "In the description of the following clauses including this
4110 ...." / "In the description of the text below ..." etc. - anyways
4111 substituting the wording "algorithms", which is a straight reference to
4112 clause 25.
4113 In that case, 25 [lib.algorithms] paragraph 9 will certainly become
4114 obsolete.
4115 Alternatively,
4116 b) Add an appropiate paragraph similar to resolved 25 [lib.algorithms],
4117 paragraph 9, to the beginning of each clause containing invalid iterator
4118 arithmetic expressions.
4119 Alternatively,
4120 c) Fix each paragraph (both current wording and possible resolutions of
4121 DRs) containing invalid iterator arithmetic expressions separately.
4122 </p>
4123
4124 <p>5) References to other DRs:</p>
4125
4126 <p>
4127 See DR 225.
4128 See DR 237. The resolution could then also read "Linear in last -
4129 first".
4130 </p>
4131 <p><b>Proposed resolution:</b></p>
4132
4133 <p><i>[Lillehammer: Minor issue, but real. We have a blanket statement
4134 about this in 25/11. But (a) it should be in 17, not 25; and (b) it's
4135 not quite broad enough, because there are some arithmetic expressions
4136 it doesn't cover. Bill will provide wording.]</i></p>
4137
4138 <hr>
4139 <a name="495"><h3>495.&nbsp;Clause 22 template parameter requirements</h3></a><p><b>Section:</b>&nbsp;22 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.localization"> [lib.localization]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;10 Jan 2005</p>
4140 <p>It appears that there are no requirements specified for many of the
4141 template parameters in clause 22. It looks like this issue has never
4142 come up, except perhaps for Facet.</p>
4143
4144 <p>Clause 22 isn't even listed in 17.3.2.1 [lib.type.descriptions],
4145 either, which is the wording that allows requirements on template
4146 parameters to be identified by name.</p>
4147
4148 <p>So one issue is that 17.3.2.1 [lib.type.descriptions] Should be
4149 changed to cover clause 22. A better change, which will cover us in
4150 the future, would be to say that it applies to all the library
4151 clauses. Then if a template gets added to any library clause we are
4152 covered.</p>
4153
4154 <p>charT, InputIterator, and other names with requirements defined
4155 elsewhere are fine, assuming the 17.3.2.1 [lib.type.descriptions] fix.
4156 But there are a few template arguments names which I don't think have
4157 requirements given elsewhere:</p>
4158
4159 <ul>
4160 <li>internT and externT.  The fix is to add wording saying that internT
4161 and externT must meet the same requirements as template arguments
4162 named charT.</li>
4163
4164 <li>stateT.  I'm not sure about this one. There already is some wording,
4165 but it seems a bit vague.</li>
4166
4167 <li>Intl.  [lib.locale.moneypunct.byname] The fix for this one is to
4168 rename "Intl" to "International". The name is important because other
4169 text identifies the requirements for the name International but not
4170 for Intl.</li>
4171 </ul>
4172 <p><b>Proposed resolution:</b></p>
4173 <p>Change 17.3.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.type.descriptions"> [lib.type.descriptions]</a>, paragraph 1, from:</p>
4174 <blockquote>
4175 The Requirements subclauses may describe names that are used to
4176 specify constraints on template arguments.153) These names are used in
4177 clauses 20, 23, 25, and 26 to describe the types that may be supplied
4178 as arguments by a C++ program when instantiating template components
4179 from the library. 
4180 </blockquote>
4181 <p>to:</p>
4182 <blockquote>
4183 The Requirements subclauses may describe names that are used to
4184 specify constraints on template arguments.153) These names are used in
4185 library clauses to describe the types that may be supplied as
4186 arguments by a C++ program when instantiating template components from
4187 the library.
4188 </blockquote>
4189
4190 <p>In the front matter of class 22, locales, add:</p>
4191 <blockquote>
4192 Template parameter types internT and externT shall meet the
4193 requirements of charT (described in 21 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.strings"> [lib.strings]</a>).
4194 </blockquote>
4195 <p><b>Rationale:</b></p>
4196 <p>
4197  Again, a blanket clause isn't blanket enough. Also, we've got a
4198  couple of names that we don't have blanket requirement statements
4199  for. The only issue is what to do about stateT. This wording is
4200  thin, but probably adequate.</p>
4201 <hr>
4202 <a name="497"><h3>497.&nbsp;meaning of numeric_limits::traps for floating point types</h3></a><p><b>Section:</b>&nbsp;18.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.numeric.limits.members"> [lib.numeric.limits.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;2 Mar 2005</p>
4203
4204 <p>18.2.1.2, p59 says this much about the traps member of numeric_limits:</p>
4205
4206 <blockquote>
4207 <p>static const bool traps;<br>
4208 -59- true if trapping is implemented for the type.204)
4209 <br>
4210 Footnote 204: Required by LIA-1.
4211 </p>
4212 </blockquote>
4213
4214 <p>It's not clear what is meant by "is implemented" here.</p>
4215
4216 <p>
4217 In the context of floating point numbers it seems reasonable to expect
4218 to be able to use traps to determine whether a program can "safely" use
4219 infinity(), quiet_NaN(), etc., in arithmetic expressions, that is
4220 without causing a trap (i.e., on UNIX without having to worry about
4221 getting a signal). When traps is true, I would expect any of the
4222 operations in section 7 of IEEE 754 to cause a trap (and my program
4223 to get a SIGFPE). So, for example, on Alpha, I would expect traps
4224 to be true by default (unless I compiled my program with the -ieee
4225 option), false by default on most other popular architectures,
4226 including IA64, MIPS, PA-RISC, PPC, SPARC, and x86 which require
4227 traps to be explicitly enabled by the program.
4228 </p>
4229
4230 <p>
4231 Another possible interpretation of p59 is that traps should be true
4232 on any implementation that supports traps regardless of whether they
4233 are enabled by default or not. I don't think such an interpretation
4234 makes the traps member very useful, even though that is how traps is
4235 implemented on several platforms. It is also the only way to implement
4236 traps on platforms that allow programs to enable and disable trapping
4237 at runtime.
4238 </p>
4239 <p><b>Proposed resolution:</b></p>
4240 <p>Change p59 to read:</p>
4241 <blockquote>True if, at program startup, there exists a value of the type that
4242   would cause an arithmetic operation using that value to trap.</blockquote>
4243 <p><b>Rationale:</b></p>
4244 <p>
4245  Real issue, since trapping can be turned on and off. Unclear what a
4246  static query can say about a dynamic issue. The real advice we should
4247  give users is to use cfenv for these sorts of queries. But this new
4248  proposed resolution is at least consistent and slightly better than
4249  nothing.</p>
4250 <hr>
4251 <a name="498"><h3>498.&nbsp;Requirements for partition() and stable_partition() too strong</h3></a><p><b>Section:</b>&nbsp;25.2.12 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.partitions"> [lib.alg.partitions]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Sean Parent, Joe Gottman&nbsp; <b>Date:</b>&nbsp;4 May 2005</p>
4252 <p>
4253 Problem:
4254 The iterator requirements for partition() and stable_partition() [25.2.12]
4255 are listed as BidirectionalIterator, however, there are efficient algorithms
4256 for these functions that only require ForwardIterator that have been known
4257 since before the standard existed. The SGI implementation includes these (see
4258 <a href="http://www.sgi.com/tech/stl/partition.html">http://www.sgi.com/tech/stl/partition.html</a>
4259 and
4260 <a href="http://www.sgi.com/tech/stl/stable_partition.html">http://www.sgi.com/tech/stl/stable_partition.html</a>).
4261 </p>
4262 <p><b>Proposed resolution:</b></p>
4263 <p>
4264 Change 25.2.12 from </p>
4265 <blockquote><pre>template&lt;class BidirectionalIterator, class Predicate&gt; 
4266 BidirectionalIterator partition(BidirectionalIterato r first, 
4267                                 BidirectionalIterator last, 
4268                                 Predicate pred); 
4269 </pre></blockquote>
4270 <p>to </p>
4271 <blockquote><pre>template&lt;class ForwardIterator, class Predicate&gt; 
4272 ForwardIterator partition(ForwardIterator first, 
4273                           ForwardIterator last, 
4274                           Predicate pred); 
4275 </pre></blockquote>
4276 <p>Change the complexity from </p>
4277
4278 <blockquote><p>
4279 At most (last - first)/2 swaps are done. Exactly (last - first) 
4280 applications of the predicate are done. 
4281 </p></blockquote>
4282
4283 <p>to </p>
4284
4285 <blockquote><p>
4286 If ForwardIterator is a bidirectional_iterator, at most (last - first)/2 
4287 swaps are done; otherwise at most (last - first) swaps are done. Exactly 
4288 (last - first) applications of the predicate are done. 
4289 </p></blockquote>
4290
4291 <p><b>Rationale:</b></p>
4292 Partition is a "foundation" algorithm useful in many contexts (like sorting
4293 as just one example) - my motivation for extending it to include forward
4294 iterators is slist - without this extension you can't partition an slist
4295 (without writing your own partition). Holes like this in the standard
4296 library weaken the argument for generic programming (ideally I'd be able
4297 to provide a library that would refine std::partition() to other concepts
4298 without fear of conflicting with other libraries doing the same - but
4299 that is a digression). I consider the fact that partition isn't defined
4300 to work for ForwardIterator a minor embarrassment.
4301
4302 <p><i>[Mont Tremblant: Moved to Open, request motivation and use cases
4303 by next meeting. Sean provided further rationale by post-meeting
4304 mailing.]</i></p>
4305
4306 <hr>
4307 <a name="499"><h3>499.&nbsp;Std. doesn't seem to require stable_sort() to be stable!</h3></a><p><b>Section:</b>&nbsp;25.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.stable.sort"> [lib.stable.sort]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Prateek Karandikar&nbsp; <b>Date:</b>&nbsp;12 Apr 2005</p>
4308 <blockquote>
4309 <p>
4310 17.3.1.1 Summary</p>
4311
4312 <p>
4313 1 The Summary provides a synopsis of the category, and introduces the 
4314 first-level subclauses. Each subclause also provides a summary, listing 
4315 the headers specified in the subclause and the library entities 
4316 provided in each header. 
4317 </p>
4318 <p>
4319 2 Paragraphs labelled "Note(s):" or "Example(s):" are informative, 
4320 other paragraphs are normative.
4321 </p>
4322 </blockquote> 
4323
4324 <p>So this means that a "Notes" paragraph wouldn't be normative. </p>
4325
4326 <blockquote>
4327 <p>
4328 25.3.1.2 stable_sort
4329 </p>
4330 <pre>template&lt;class RandomAccessIterator&gt; 
4331 void stable_sort(RandomAccessIterat or first, RandomAccessIterator last); 
4332
4333 template&lt;class RandomAccessIterator, class Compare&gt; 
4334 void stable_sort(RandomAccessIterat or first, RandomAccessIterator last, Compare comp);
4335 </pre>
4336 <p>
4337 1 Effects: Sorts the elements in the range [first, last).
4338 </p>
4339 <p>
4340 2 Complexity: It does at most N(log N)^2 (where N == last - first) 
4341 comparisons; if enough extra memory is available, it is N log N.
4342 </p>
4343 <p>
4344 3 Notes: Stable: the relative order of the equivalent elements is 
4345 preserved. 
4346 </p>
4347 </blockquote> 
4348
4349 <p>
4350 The Notes para is informative, and nowhere else is stability mentioned above. 
4351 </p>
4352
4353 <p>
4354 Also, I just searched for the word "stable" in my copy of the Standard. 
4355 and the phrase "Notes: Stable: the relative order of the elements..." 
4356 is repeated several times in the Standard library clauses for 
4357 describing various functions. How is it that stability is talked about 
4358 in the informative paragraph? Or am I missing something obvious? 
4359 </p>
4360 <p><b>Proposed resolution:</b></p>
4361 <p>
4362 </p>
4363 <hr>
4364 <a name="501"><h3>501.&nbsp;Proposal: strengthen guarantees of lib.comparisons</h3></a><p><b>Section:</b>&nbsp;20.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.comparisons"> [lib.comparisons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Me &lt;anti_spam_email2003@yahoo.com&gt;&nbsp; <b>Date:</b>&nbsp;7 Jun 2005</p>
4365 <blockquote>
4366 "For templates greater, less, greater_equal, and less_equal,
4367 the specializations for any pointer type yield a total order, even if
4368 the built-in operators &lt;, &gt;, &lt;=, &gt;= do not."
4369 </blockquote>
4370
4371 <p>
4372 The standard should do much better than guarantee that these provide a
4373 total order, it should guarantee that it can be used to test if memory
4374 overlaps, i.e. write a portable memmove. You can imagine a platform
4375 where the built-in operators use a uint32_t comparison (this tests for
4376 overlap on this platform) but the less&lt;T*&gt; functor is allowed to be
4377 defined to use a int32_t comparison. On this platform, if you use
4378 std::less with the intent of making a portable memmove, comparison on
4379 an array that straddles the 0x7FFFFFFF/0x8000000 boundary can give
4380 incorrect results.
4381 </p>
4382 <p><b>Proposed resolution:</b></p>
4383 <p>
4384 Add a footnote to 20.3.3/8 saying:
4385 </p>
4386
4387 <blockquote>
4388 Given a p1 and p2 such that p1 points to N objects of type T and p2
4389 points to M objects of type T. If [p1,p1+N) does not overlap [p2,p2+M),
4390 less returns the same value when comparing all pointers in [p1,p1+N) to
4391 all pointers in [p2,p2+M). Otherwise, there is a value Q and a value R
4392 such that less returns the same value when comparing all pointers in
4393 [p1,p1+Q) to all pointers in [p2,p2+R) and an opposite value when
4394 comparing all pointers in [p1+Q,p1+N) to all pointers in [p2+R,p2+M).
4395 For the sake of completeness, the null pointer value (4.10) for T is
4396 considered to be an array of 1 object that doesn't overlap with any
4397 non-null pointer to T. less_equal, greater, greater_equal, equal_to,
4398 and not_equal_to give the expected results based on the total ordering
4399 semantics of less. For T of void, treat it as having similar semantics
4400 as T of char i.e. less&lt;cv T*&gt;(a, b) gives the same results as less&lt;cv
4401 void*&gt;(a, b) which gives the same results as less&lt;cv char*&gt;((cv
4402 char*)(cv void*)a, (cv char*)(cv void*)b).
4403 </blockquote>
4404
4405 <p>
4406 I'm also thinking there should be a footnote to 20.3.3/1 saying that if
4407 A and B are similar types (4.4/4), comp&lt;A&gt;(a,b) returns the same value
4408 as comp&lt;B&gt;(a,b) (where comp is less, less_equal, etc.). But this might
4409 be problematic if there is some really funky operator overloading going
4410 on that does different things based on cv (that should be undefined
4411 behavior if somebody does that though). This at least should be
4412 guaranteed for all POD types (especially pointers) that use the
4413 built-in comparison operators.
4414 </p>
4415
4416 <hr>
4417 <a name="502"><h3>502.&nbsp;Proposition: Clarification of the interaction between a facet and an iterator</h3></a><p><b>Section:</b>&nbsp;22.1.1.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.category"> [lib.locale.category]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Christopher Conrade Zseleghovski&nbsp; <b>Date:</b>&nbsp;7 Jun 2005</p>
4418 <p>
4419 Motivation:
4420 </p>
4421
4422 <p>
4423 This requirement seems obvious to me, it is the essence of code modularity. 
4424 I have complained to Mr. Plauger that the Dinkumware library does not 
4425 observe this principle but he objected that this behaviour is not covered in 
4426 the standard.
4427 </p>
4428 <p><b>Proposed resolution:</b></p>
4429 <p>
4430 Append the following point to 22.1.1.1.1:
4431 </p>
4432
4433 <p>
4434 6. The implementation of a facet of Table 52 parametrized with an 
4435 InputIterator/OutputIterator should use that iterator only as character 
4436 source/sink respectively.
4437 For a *_get facet, it means that the value received depends only on the 
4438 sequence of input characters and not on how they are accessed.
4439 For a *_put facet, it means that the sequence of characters output depends 
4440 only on the value to be formatted and not of how the characters are stored.
4441 </p>
4442 <hr>
4443 <a name="503"><h3>503.&nbsp;more on locales</h3></a><p><b>Section:</b>&nbsp;22.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.categories"> [lib.locale.categories]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;P.J. Plauger&nbsp; <b>Date:</b>&nbsp;20 Jun 2005</p>
4444 <p>
4445 a) In 22.2.1.1 para. 2 we refer to "the instantiations required in Table
4446 51" to refer to the facet *objects* associated with a locale. And we
4447 almost certainly mean just those associated with the default or "C"
4448 locale. Otherwise, you can't switch to a locale that enforces a different
4449 mapping between narrow and wide characters, or that defines additional
4450 uppercase characters.
4451 </p>
4452
4453 <p>
4454 b) 22.2.1.5 para. 3 (codecvt) has the same issues.
4455 </p>
4456
4457 <p>
4458 c) 22.2.1.5.2 (do_unshift) is even worse. It *forbids* the generation of
4459 a homing sequence for the basic character set, which might very well need
4460 one.
4461 </p>
4462
4463 <p>
4464 d) 22.2.1.5.2 (do_length) likewise dictates that the default mapping
4465 between wide and narrow characters be taken as one-for-one.
4466 </p>
4467
4468 <p>
4469 e) 22.2.2 para. 2 (num_get/put) is both muddled and vacuous, as far as
4470 I can tell. The muddle is, as before, calling Table 51 a list of
4471 instantiations. But the constraint it applies seems to me to cover
4472 *all* defined uses of num_get/put, so why bother to say so?
4473 </p>
4474
4475 <p>
4476 f) 22.2.3.1.2 para. 1(do_decimal_point) says "The required instantiations
4477 return '.' or L'.'.) Presumably this means "as appropriate for the
4478 character type. But given the vague definition of "required" earlier,
4479 this overrules *any* change of decimal point for non "C" locales.
4480 Surely we don't want to do that.
4481 </p>
4482
4483 <p>
4484 g) 22.2.3.1.2 para. 2 (do_thousands_sep) says "The required instantiations
4485 return ',' or L','.) As above, this probably means "as appropriate for the
4486 character type. But this overrules the "C" locale, which requires *no*
4487 character ('\0') for the thousands separator. Even if we agree that we
4488 don't mean to block changes in decimal point or thousands separator,
4489 we should also eliminate this clear incompatibility with C.
4490 </p>
4491
4492 <p>
4493 h) 22.2.3.1.2 para. 2 (do_grouping) says "The required instantiations
4494 return the empty string, indicating no grouping." Same considerations
4495 as for do_decimal_point.
4496 </p>
4497
4498 <p>
4499 i) 22.2.4.1 para. 1 (collate) refers to "instantiations required in Table
4500 51". Same bad jargon.
4501 </p>
4502
4503 <p>
4504 j) 22.2.4.1.2 para. 1 (do_compare) refers to "instantiations required
4505 in Table 51". Same bad jargon.
4506 </p>
4507
4508 <p>
4509 k) 22.2.5 para. 1 (time_get/put) uses the same muddled and vacuous
4510 as num_get/put.
4511 </p>
4512
4513 <p>
4514 l) 22.2.6 para. 2 (money_get/put) uses the same muddled and vacuous
4515 as num_get/put.
4516 </p>
4517
4518 <p>
4519 m) 22.2.6.3.2 (do_pos/neg_format) says "The instantiations required
4520 in Table 51 ... return an object of type pattern initialized to
4521 {symbol, sign, none, value}." This once again *overrides* the "C"
4522 locale, as well as any other locale."
4523 </p>
4524
4525 <p>
4526 3) We constrain the use_facet calls that can be made by num_get/put,
4527 so why don't we do the same for money_get/put? Or for any of the
4528 other facets, for that matter?
4529 </p>
4530
4531 <p>
4532 4) As an almost aside, we spell out when a facet needs to use the ctype
4533 facet, but several also need to use a codecvt facet and we don't say so.
4534 </p>
4535 <p><b>Proposed resolution:</b></p>
4536 <p>
4537 </p>
4538 <hr>
4539 <a name="504"><h3>504.&nbsp;Integer types in pseudo-random number engine requirements</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.req"> [tr.rand.req]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4540 <p>
4541 In [tr.rand.req], Paragraph 2 states that "... s is a value of integral type,
4542 g is an ... object returning values of unsigned integral type ..."
4543 </p>
4544 <p><b>Proposed resolution:</b></p>
4545 <p>
4546 In 5.1.1 [tr.rand.req], Paragraph 2 replace
4547 </p>
4548
4549 <blockquote>
4550 ... s is a value of integral type, g is an lvalue of a type other than X that
4551 defines a zero-argument function object returning values of <del>unsigned integral</del> type
4552 <ins><tt>unsigned long int</tt></ins>,
4553 ...
4554 </blockquote>
4555
4556 <p>
4557 In 5.1.1 [tr.rand.seq], Table 16, replace in the line for X(s)
4558 </p>
4559
4560 <blockquote>
4561 creates an engine with the initial internal state
4562 determined by <ins><tt>static_cast&lt;unsigned long&gt;(</tt></ins><tt><i>s</i></tt><ins><tt>)</tt></ins>
4563 </blockquote>
4564
4565 <p><i>[
4566 Mont Tremblant:  Both s and g should be unsigned long.
4567 This should refer to the constructor signatures. Jens  provided wording post Mont Tremblant.
4568 ]</i></p>
4569
4570 <p><b>Rationale:</b></p>
4571 <p>
4572 Jens:  Just requiring X(unsigned long) still makes it possible
4573 for an evil library writer to also supply a X(int) that does something
4574 unexpected.  The wording above requires that X(s) always performs
4575 as if X(unsigned long) would have been called.  I believe that is
4576 sufficient and implements our intentions from Mont Tremblant.  I
4577 see no additional use in actually requiring a X(unsigned long)
4578 signature.  u.seed(s) is covered by its reference to X(s), same
4579 arguments.
4580 </p>
4581 <hr>
4582 <a name="505"><h3>505.&nbsp;Result_type in random distribution requirements</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.req"> [tr.rand.req]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4583 <p>
4584 Table 17: Random distribution requirements
4585 </p>
4586 <p>
4587 Row 1 requires that each random distribution provide a nested type "input_type";
4588 this type denotes the type of the values that the distribution consumes.
4589 </p>
4590 <p>
4591 Inspection of all distributions in [tr.rand.dist] reveals that each distribution
4592 provides a second typedef ("result_type") that denotes the type of the values the
4593 distribution produces when called.  
4594 </p>
4595 <p><b>Proposed resolution:</b></p>
4596 <p>
4597 It seems to me that this is also a requirement
4598 for all distributions and should therefore be  indicated as such via a new second
4599 row to this table 17:
4600 </p>
4601 <table border="1" cellpadding="5">
4602 <tbody><tr>
4603 <td>X::result_type</td>
4604 <td>T</td>
4605 <td>---</td>
4606 <td>compile-time</td>
4607 </tr>
4608 </tbody></table>
4609 <hr>
4610 <a name="506"><h3>506.&nbsp;Requirements of Distribution parameter for variate_generator</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.var"> [tr.rand.var]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4611 <p>
4612 Paragraph 3 requires that template argument U (which corresponds to template
4613 parameter Engine) satisfy all uniform random number generator requirements.
4614 However, there is no  analogous requirement regarding the template argument
4615 that corresponds to template parameter Distribution.  We believe there should
4616 be, and that it should require that this template argument satisfy all random
4617 distribution requirements.
4618 </p>
4619 <p><b>Proposed resolution:</b></p>
4620 <p>
4621 Consequence 1: Remove the precondition clauses [tr.rand.var]/16 and /18.
4622 </p>
4623 <p>
4624 Consequence 2: Add max() and min() functions to those distributions that
4625 do not already have them.
4626 </p>
4627
4628 <p><i>[
4629 Mont Tremblant: Jens reccommends NAD, min/max not needed everywhere.
4630 Marc supports having min and max to satisfy generic programming interface.
4631 ]</i></p>
4632
4633 <hr>
4634 <a name="507"><h3>507.&nbsp;Missing requirement for variate_generator::operator()</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.var"> [tr.rand.var]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4635 <p>
4636 Paragraph 11 of [tr.rand.var] equires that the member template
4637 </p>
4638 <blockquote><pre>template&lt;class T&gt; result_type operator() (T value);
4639 </pre></blockquote>
4640 <p>
4641 return
4642 </p>
4643 <blockquote><pre>distribution()(e, value)
4644 </pre></blockquote>
4645 <p>
4646 However, not all distributions have an operator() with a corresponding signature.
4647 </p>
4648 <p><b>Proposed resolution:</b></p>
4649 <p>
4650 We therefore  recommend that we insert the following precondition before paragraph 11:
4651 </p>
4652 <blockquote>
4653 Precondition:  <tt>distribution().operator()(e,value)</tt> is well-formed.
4654 </blockquote>
4655 <hr>
4656 <a name="508"><h3>508.&nbsp;Bad parameters for ranlux64_base_01</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.predef"> [tr.rand.predef]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4657 <p>
4658 The fifth of these engines with predefined parameters, ranlux64_base_01,
4659 appears to have an unintentional error for which there is a simple correction.
4660 The two pre-defined  subtract_with_carry_01 engines are given as: 
4661 </p>
4662 <blockquote><pre>typedef subtract_with_carry_01&lt;float,  24, 10, 24&gt; ranlux_base_01;
4663 typedef subtract_with_carry_01&lt;double, 48, 10, 24&gt; ranlux64_base_01;
4664 </pre></blockquote>
4665 <p>
4666 We demonstrate below that ranlux64_base_01 fails to meet the intent of the
4667 random number generation proposal, but that the simple correction to
4668 </p>
4669 <blockquote><pre>typedef subtract_with_carry_01&lt;double, 48,  5, 12&gt; ranlux64_base_01;
4670 </pre></blockquote>
4671 <p>
4672 does meet the intent of defining well-known good parameterizations.
4673 </p>
4674 <p>
4675 The ranlux64_base_01 engine as presented fails to meet the intent for
4676 predefined engines, stated in proposal N1398 (section E):
4677 </p>
4678 <blockquote><p>
4679 In order to make good random numbers available to a large number of library
4680 users, this proposal not only defines generic random-number engines, but also
4681 provides a number of predefined well-known good parameterizations for those.
4682 </p></blockquote>
4683 <p>
4684 The predefined ranlux_base_01 engine has been proven [1,2,3] to have a very
4685 long period and so meets this criterion.  This property makes it suitable for
4686 use in the excellent discard_block  engines defined subsequently.  The proof
4687 of long period relies on the fact (proven in [1]) that 2**(w*r) - 2**(w*s)
4688 + 1 is prime (w, r, and s are template parameters to subtract_with_carry_01,
4689 as defined in [tr.rand.eng.sub1]).
4690 </p>
4691 <p>
4692 The ranlux64_base_01 engine as presented in [tr.rand.predef] uses w=48, r=24, s=10.
4693 For these numbers, the combination 2**(w*r)-2**(w*s)+1 is non-prime (though
4694 explicit factorization  would be a challenge).  In consequence, while it is
4695 certainly possible for some seeding states that this engine would have a very
4696 long period, it is not at all Ã’well-knownÓ that this is the case. The intent
4697 in the N1398 proposal involved the base of the ranlux64 engine, which finds heavy
4698 use in the physics community.  This is isomorphic to the predefined ranlux_base_01,
4699 but exploits the ability of double variables to hold (at least) 48 bits of mantissa,
4700 to deliver 48 random bits at a time rather than 24.
4701 </p>
4702 <p><b>Proposed resolution:</b></p>
4703 <p>
4704 To achieve this intended behavior, the correct template parameteriztion  would be:
4705 </p>
4706 <blockquote><pre>typedef subtract_with_carry_01&lt;double, 48, 5, 12&gt; ranlux64_base_01;
4707 </pre></blockquote>
4708 <p>
4709 The sequence of mantissa bits delivered by this is isomorphic (treating each
4710 double as having the  bits of two floats) to that delivered by ranlux_base_01.
4711 </p>
4712 <p>
4713 <b>References:</b>
4714 </p>
4715 <ol>
4716 <li>F. James, Comput. Phys. Commun. 60(1990) 329</li>
4717 <li>G. Marsaglia and A. Zaman, Ann. Appl. Prob 1(1991) 462</li>
4718 <li>M. Luscher, Comput. Phys. Commun. 79(1994) 100-110</li>
4719 </ol>
4720
4721 <hr>
4722 <a name="509"><h3>509.&nbsp;Uniform_int template parameters</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.7.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.dist.iunif"> [tr.rand.dist.iunif]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4723 <p>
4724 In [tr.rand.dist.iunif] the uniform_int distribution currently has a single
4725 template parameter, IntType, used as the input_type and as the result_type
4726 of the distribution.  We believe there is no reason to conflate these types
4727 in this way.
4728 </p>
4729 <p><b>Proposed resolution:</b></p>
4730 <p>
4731 We recommend that there be a second template  parameter to
4732 reflect the distributionÕs input_type, and that the existing first template
4733 parameter continue to reflect (solely) the result_type:
4734 </p>
4735 <blockquote><pre>template&lt; class IntType = int, UIntType = unsigned int &gt;
4736 class uniform_int
4737 {
4738 public:
4739   // types
4740   typedef  UIntType  input_type;
4741   typedef  IntType   result_type;
4742 </pre></blockquote>
4743 <hr>
4744 <a name="510"><h3>510.&nbsp;Input_type for bernoulli_distribution</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.7.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.dist.bern"> [tr.rand.dist.bern]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4745 <p>
4746 In [tr.rand.dist.bern] the distribution currently requires;
4747 </p>
4748 <blockquote><pre>typedef  int  input_type;
4749 </pre></blockquote>
4750 <p><b>Proposed resolution:</b></p>
4751 <p>
4752 We believe this is an unfortunate choice, and recommend instead:
4753 </p>
4754 <blockquote><pre>typedef  unsigned int  input_type;
4755 </pre></blockquote>
4756 <hr>
4757 <a name="511"><h3>511.&nbsp;Input_type for binomial_distribution</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.7.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.dist.bin"> [tr.rand.dist.bin]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4758 <p>
4759 Unlike all other distributions in TR1, this binomial_distribution has an
4760 implementation-defined  input_type.  We believe this is an unfortunate choice,
4761 because it hinders users from writing portable code.  It also hinders the
4762 writing of compliance tests.  We recommend instead:
4763 </p>
4764 <blockquote><pre>typedef  RealType  input_type;
4765 </pre></blockquote>
4766 <p>
4767 While this choice is somewhat arbitrary (as it was for some of the other
4768 distributions), we make  this particular choice because (unlike all other
4769 distributions) otherwise this template would not publish its RealType
4770 argument and so users could not write generic code that accessed this
4771 second template parameter.  In this respect, the choice is consistent with
4772 the other distributions in  TR1. 
4773 </p>
4774 <p>
4775 We have two reasons for recommending that a real type be specified instead.
4776 One reason is  based specifically on characteristics of binomial distribution
4777 implementations, while the other is based on mathematical characteristics of
4778 probability distribution functions in general.
4779 </p>
4780 <p>
4781 Implementations of binomial distributions commonly use Stirling approximations
4782 for values in certain ranges.  It is far more natural to use real values to
4783 represent these approximations than it would be to use integral values to do
4784 so.  In other ranges, implementations reply on the Bernoulli  distribution to
4785 obtain values.  While TR1Õs bernoulli_distribution::input_type is specified as
4786 int, we believe this would be better specified as double.
4787 </p>
4788 <p>
4789 This brings us to our main point:  The notion of a random distribution rests
4790 on the notion of a cumulative distribution function, which in turn mathematically
4791 depends on a continuous dependent variable.  Indeed, such a distribution function
4792 would be meaningless if it depended on  discrete values such as integersÑand this
4793 remains true even if the distribution function were to take discrete steps.
4794 </p>
4795 <p>
4796 Although this note is specifically about binomial_distribution::input_type,
4797 we intend to recommend that all of the random distributionsÕ input_types be
4798 specified as a real type (either a RealType template parameter, or double,
4799 as appropriate).
4800 </p>
4801 <p>
4802 Of the nine distributions in TR1, four already have this characteristic
4803 (uniform_real, exponential_distribution, normal_distribution, and
4804 gamma_distribution).  We have already argued the case for the binomial the
4805 remaining four distributions.
4806 </p>
4807 <p>
4808 In the case of uniform_int, we believe that the calculations to produce an
4809 integer result in a  specified range from an integer in a different specified
4810 range is best done using real arithmetic.  This is because it involves a
4811 product, one of whose terms is the ratio of the extents of the two ranges.
4812 Without real arithmetic, the results become less uniform: some numbers become
4813 more  (or less) probable that they should be.  This is, of course, undesireable
4814 behavior in a uniform distribution.
4815 </p>
4816 <p>
4817 Finally, we believe that in the case of the bernoulli_distribution (briefly
4818 mentioned earlier), as well as the cases of the geometric_distribution and the
4819 poisson_distribution, it would be far more natural to have a real input_type.
4820 This is because the most natural computation involves the  random number
4821 delivered and the distributionÕs parameter p (in the case of bernoulli_distribution,
4822 for example, the computation is a comparison against p), and p is already specified
4823 in each case as having some real type.
4824 </p>
4825 <p><b>Proposed resolution:</b></p>
4826 <blockquote><pre>typedef  RealType  input_type;
4827 </pre></blockquote>
4828 <hr>
4829 <a name="512"></a><h3><a name="512">512.&nbsp;Seeding subtract_with_carry_01 from a single unsigned long</a></h3><p><b>Section:</b>&nbsp;TR1 5.1.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.eng.sub1"> [tr.rand.eng.sub1]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4830 <p>
4831 Paragraph 8 specifies the algorithm by which a subtract_with_carry_01  engine
4832 is to be seeded given a single unsigned long.  This algorithm is seriously
4833 flawed in the case where the engine parameter w (also known as word_size)
4834 exceeds 31 [bits].  The key part of the paragraph reads:
4835 </p>
4836 <blockquote>
4837 sets x(-r) ... x(-1) to (lcg(1)*2**(-w)) mod 1
4838 </blockquote>
4839 <p>
4840 and so forth. 
4841 </p>
4842 <p>
4843 Since the specified linear congruential engine, lcg, delivers numbers with
4844 a maximum of 2147483563 (just a shade under 31 bits), then when w is, for
4845 example, 48, each of the x(i) will be less than 2**-17.  The consequence
4846 is that roughly the first 400 numbers delivered will be  conspicuously
4847 close to either zero or one.
4848 </p>
4849 <p>
4850 Unfortunately, this is not an innocuous flaw:  One of the predefined engines
4851 in [tr.rand.predef],  namely ranlux64_base_01, has w = 48 and would exhibit
4852 this poor behavior, while the original N1378 proposal states that these
4853 pre-defined engines are intended to be of "known good properties."
4854 </p>
4855 <p><b>Proposed resolution:</b></p>
4856 <p>
4857 In 5.1.4.4 [tr.rand.eng.sub1], replace the "effects" clause for
4858 void seed(unsigned long value = 19780503) by
4859 </p>
4860
4861 <blockquote>
4862 <i>Effects:</i> If <tt>value == 0</tt>, sets value to <tt>19780503</tt>. In any
4863 case, <del>with a linear congruential generator <tt>lcg</tt>(i) having parameters
4864 <tt><i>m<sub>lcg</sub></i> = 2147483563</tt>, <tt><i>a<sub>lcg</sub></i> = 40014</tt>,
4865 <tt><i>c<sub>lcg</sub></i> = 0</tt>, and <tt><i>lcg</i>(0) = value</tt>,</del>
4866 sets <ins>carry<tt>(-1)</tt> and</ins> <tt>x(-r) &#8230; x(-1)</tt>
4867 <ins>as if executing</ins>
4868
4869 <blockquote><pre><ins>
4870 linear_congruential&lt;unsigned long, 40014, 0, 2147483563&gt; lcg(value);
4871 seed(lcg);
4872 </ins></pre></blockquote>
4873
4874 <del>to <tt>(<i>lcg</i>(1) Â· 2<sup>-<i>w</i></sup>) mod 1
4875 &#8230; (<i>lcg</i>(<i>r</i>) Â· 2<sup>-<i>w</i></sup>) mod 1</tt>,
4876 respectively. If <tt><i>x</i>(-1) == 0</tt>, sets carry<tt>(-1) = 2<sup>-<i>w</i></sup></tt>,
4877 else sets carry<tt>(-1) = 0</tt>.</del>
4878 </blockquote>
4879
4880 <p><i>[
4881 Jens provided revised wording post Mont Tremblant.
4882 ]</i></p>
4883
4884 <p><b>Rationale:</b></p>
4885 <p>
4886 Jens: I'm using an explicit type here, because fixing the
4887 prose would probably not qualify for the (with issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#504">504</a> even
4888 stricter) requirements we have for seed(Gen&amp;).
4889 </p>
4890 <hr>
4891 <a name="513"><h3>513.&nbsp;Size of state for subtract_with_carry_01</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.eng.sub1"> [tr.rand.eng.sub1]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4892 <p>
4893 Paragraph 3 begins:
4894 </p>
4895 <blockquote>
4896 The size of the state is r.
4897 </blockquote>
4898 <p>
4899 However, this is not quite consistent with the remainder of the paragraph
4900 which specifies a total  of nr+1 items in the textual representation of
4901 the state.  We recommend the sentence be corrected to match:
4902 </p>
4903 <blockquote>
4904 The size of the state is nr+1.
4905 </blockquote>
4906 <p>
4907 To give meaning to the coefficient n, it may be also desirable to move
4908 nÕs definition from later in the paragraph.  Either of the following
4909 seem reasonable formulations:
4910 </p>
4911 <blockquote>
4912 With n=..., the size of the state is nr+1.
4913 </blockquote>
4914 <blockquote>
4915 The size of the state is nr+1, where n=... .
4916 </blockquote>
4917 <p>
4918 </p>
4919 <p><b>Proposed resolution:</b></p>
4920 <p><i>[
4921 Jens:  I plead for "NAD" on the grounds that "size of state" is only
4922 used as an argument for big-O complexity notation, thus
4923 constant factors and additions don't count.
4924 ]</i></p>
4925 <hr>
4926 <a name="514"><h3>514.&nbsp;Size of state for subtract_with_carry</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.eng.sub"> [tr.rand.eng.sub]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Open">Open</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4927 <p>
4928 Paragraph 2 begins:
4929 </p>
4930 <blockquote>
4931 The size of the state is r.
4932 </blockquote>
4933 <p>
4934 However, the next sentence specifies a total of r+1 items in the textual
4935 representation of the state,  r specific xÕs as well as a specific carry.
4936 This makes a total of r+1 items that constitute the size of the state,
4937 rather than r.
4938 </p>
4939 <p><b>Proposed resolution:</b></p>
4940 <p>
4941 We recommend the sentence be corrected to match:
4942 </p>
4943 <blockquote>
4944  The size of the state is r+1.
4945 </blockquote>
4946
4947 <p><i>[
4948 Jens:  I plead for "NAD" on the grounds that "size of state" is only
4949 used as an argument for big-O complexity notation, thus
4950 constant factors and additions don't count.
4951 ]</i></p>
4952
4953 <hr>
4954 <a name="515"><h3>515.&nbsp;Random number engine traits</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.synopsis"> [tr.rand.synopsis]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
4955 <p>
4956 To accompany the concept of a pseudo-random number engine as defined in Table 17,
4957 we propose and recommend an adjunct template, engine_traits, to be declared in
4958 [tr.rand.synopsis] as:
4959 </p>
4960 <blockquote><pre>template&lt; class PSRE &gt;
4961 class engine_traits;
4962 </pre></blockquote>
4963 <p>
4964 This templateÕs primary purpose would be as an aid to generic programming involving
4965 pseudo-random number engines.  Given only the facilities described in tr1, it would
4966 be very difficult to produce any algorithms involving the notion of a generic engine.
4967 The intent of this proposal is to  provide, via engine_traits&lt;&gt;, sufficient
4968 descriptive information to allow an algorithm to employ a pseudo-random number engine
4969 without regard to its exact type, i.e., as a template parameter.
4970 </p>
4971 <p>
4972 For example, today it is not possible to write an efficient generic function that
4973 requires any specific number of random bits.  More specifically, consider a
4974 cryptographic application that internally needs 256 bits of randomness per call:
4975 </p>
4976 <blockquote><pre>template&lt; class Eng, class InIter, class OutIter &gt;
4977 void crypto( Eng&amp; e, InIter in, OutIter out );
4978 </pre></blockquote>
4979 <p>
4980 Without knowning the number of bits of randomness produced per call to a provided
4981 engine, the algorithm has no means of determining how many times to call the engine.
4982 </p>
4983 <p>
4984 In a new section [tr.rand.eng.traits], we proposed to define the engine_traits
4985 template as: 
4986 </p>
4987 <blockquote><pre>template&lt; class PSRE &gt;
4988 class engine_traits
4989 {
4990   static  std::size_t  bits_of_randomness = 0u;
4991   static  std::string  name()  { return "unknown_engine"; }
4992   // TODO: other traits here
4993 };
4994 </pre></blockquote>
4995 <p>
4996 Further, each engine described in [tr.rand.engine] would be accompanied by a
4997 complete specialization of this new engine_traits template.
4998 </p>
4999 <p><b>Proposed resolution:</b></p>
5000 <p>
5001
5002 </p>
5003 <hr>
5004 <a name="516"><h3>516.&nbsp;Seeding subtract_with_carry_01 using a generator</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.eng.sub1"> [tr.rand.eng.sub1]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5005 <p>
5006 Paragraph 6 says:
5007 </p>
5008 <blockquote>
5009 ... obtained by successive invocations of g, ... 
5010 </blockquote>
5011 <p>
5012 We recommend instead:
5013 </p>
5014 <blockquote>
5015 ... obtained by taking successive invocations of g mod 2**32, ...
5016 </blockquote>
5017 <p>
5018 as the context seems to require only 32-bit quantities be used here.
5019 </p>
5020 <p><b>Proposed resolution:</b></p>
5021 <p>
5022
5023 </p>
5024 <hr>
5025 <a name="517"><h3>517.&nbsp;Should include name in external representation</h3></a><p><b>Section:</b>&nbsp;TR1 5.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.rand.req"> [tr.rand.req]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5026 <p>
5027 The last two rows of Table 16 deal with the i/o requirements of an engine,
5028 specifying that the textual representation of an engineÕs state,
5029 appropriately formatted, constitute the engineÕs  external representation.
5030 </p>
5031 <p>
5032 This seems adequate when an engineÕs type is known.  However, it seems
5033 inadequate in the  context of generic code, where it becomes useful and
5034 perhaps even necessary to determine an engineÕs type via input.
5035 </p>
5036 <p>
5037 </p>
5038 <p><b>Proposed resolution:</b></p>
5039 <p>
5040 We therefore recommend that, in each of these two rows of Table 16, the
5041 text "textual representation" be expanded so as to read "engine name
5042 followed by the textual representation."
5043 </p>
5044 <hr>
5045 <a name="518"><h3>518.&nbsp;Are insert and erase stable for unordered_multiset and unordered_multimap?</h3></a><p><b>Section:</b>&nbsp;TR1 6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.hash"> [tr.hash]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Review">Review</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5046 <p>
5047 Issue 371 deals with stability of multiset/multimap under insert and erase
5048 (i.e. do they preserve the relative order in ranges of equal elements).
5049 The same issue applies to unordered_multiset and unordered_multimap.
5050 </p>
5051 <p><b>Proposed resolution:</b></p>
5052 <p>
5053 </p>
5054 <hr>
5055 <a name="519"><h3>519.&nbsp;Data() undocumented</h3></a><p><b>Section:</b>&nbsp;TR1 6.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.array.array"> [tr.array.array]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#Ready">Ready</a>&nbsp; <b>Submitter:</b>&nbsp;Pete Becker&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5056 <p>
5057 <tt>array&lt;&gt;::data()</tt> is present in the class synopsis, but not documented.
5058 </p>
5059 <p><b>Proposed resolution:</b></p>
5060 <p>
5061 Add a new section, after 6.2.2.3:
5062 </p>
5063 <blockquote><pre>T*       data()
5064 const T* data() const;
5065 </pre></blockquote>
5066 <p>
5067 <b>Returns:</b> <tt>elems</tt>.
5068 </p>
5069 <p>
5070 Change 6.2.2.4/2 to:
5071 </p>
5072 <blockquote>
5073 In the case where <tt>N == 0</tt>, <tt>begin() == end()</tt>. The return value
5074 of <tt>data()</tt> is unspecified.
5075 </blockquote>
5076 <hr>
5077 <a name="520"><h3>520.&nbsp;Result_of and pointers to data members</h3></a><p><b>Section:</b>&nbsp;TR1 3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.func.bind"> [tr.func.bind]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Pete Becker&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5078 <p>
5079 In the original proposal for binders, the return type of bind() when
5080 called with a pointer to member data as it's callable object was
5081 defined to be mem_fn(ptr); when Peter Dimov and I  unified the
5082 descriptions of the TR1 function objects we hoisted the descriptions
5083 of return types into the INVOKE pseudo-function and into result_of.
5084 Unfortunately, we left pointer to member data out of result_of, so
5085 bind doesn't have any specified behavior when called with a pointer
5086 to  member data.
5087 </p>
5088 <p><b>Proposed resolution:</b></p>
5089 <p><i>[
5090 Pete and Peter will provide wording.
5091 ]</i></p>
5092 <hr>
5093 <a name="521"><h3>521.&nbsp;Garbled requirements for argument_type in reference_wrapper</h3></a><p><b>Section:</b>&nbsp;TR1 2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.util.refwrp.refwrp"> [tr.util.refwrp.refwrp]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Pete Becker&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5094 <p>
5095 2.1.2/3, second bullet item currently says that reference_wrapper&lt;T&gt; is
5096 derived from unary_function&lt;T, R&gt; if T is:
5097 </p>
5098 <blockquote>
5099 a pointer to member function type with cv-qualifier cv and no arguments;
5100 the type T1 is cv T* and R is the return type of the pointer to member function;
5101 </blockquote>
5102 <p>
5103 The type of T1 can't be cv T*, 'cause that's a pointer to a pointer to member
5104 function. It should be a pointer to the class that T is a pointer to member of.
5105 Like this:
5106 </p>
5107 <blockquote>
5108 a pointer to a member function R T0::f() cv (where cv represents the member
5109 function's cv-qualifiers); the type T1 is cv T0*
5110 </blockquote>
5111 <p>
5112 Similarly, bullet item 2 in 2.1.2/4 should be:
5113 </p>
5114 <blockquote>
5115 a pointer to a member function R T0::f(T2) cv (where cv represents the member
5116 function's cv-qualifiers); the type T1 is cv T0*
5117 </blockquote>
5118 <p><b>Proposed resolution:</b></p>
5119 <hr>
5120 <a name="522"></a><h3><a name="522">522.&nbsp;Tuple doesn't define swap</a></h3><p><b>Section:</b>&nbsp;TR1 6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.tuple"> [tr.tuple]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Koenig&nbsp; <b>Date:</b>&nbsp;3 Jul 2005</p>
5121 <p>
5122 Tuple doesn't define swap().  It should.
5123 </p>
5124 <p><b>Proposed resolution:</b></p>
5125 <hr>
5126 <a name="523"><h3>523.&nbsp;regex case-insensitive character ranges are unimplementable as specified</h3></a><p><b>Section:</b>&nbsp;TR1 7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.re"> [tr.re]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Eric Niebler&nbsp; <b>Date:</b>&nbsp;1 Jul 2005</p>
5127 <p>
5128 A problem with TR1 regex is currently being discussed on the Boost 
5129 developers list. It involves the handling of case-insensitive matching 
5130 of character ranges such as [Z-a]. The proper behavior (according to the 
5131 ECMAScript standard) is unimplementable given the current specification 
5132 of the TR1 regex_traits&lt;&gt; class template. John Maddock, the author of 
5133 the TR1 regex proposal, agrees there is a problem. The full discussion 
5134 can be found at http://lists.boost.org/boost/2005/06/28850.php (first 
5135 message copied below). We don't have any recommendations as yet.
5136 </p>
5137 <p>
5138 -- Begin original message --
5139 </p>
5140 <p>
5141 The situation of interest is described in the ECMAScript specification
5142 (ECMA-262), section 15.10.2.15:
5143 </p>
5144 <p>
5145 "Even if the pattern ignores case, the case of the two ends of a range
5146 is significant in determining which characters belong to the range.
5147 Thus, for example, the pattern /[E-F]/i matches only the letters E, F,
5148 e, and f, while the pattern /[E-f]/i matches all upper and lower-case
5149 ASCII letters as well as the symbols [, \, ], ^, _, and `."
5150 </p>
5151 <p>
5152 A more interesting case is what should happen when doing a
5153 case-insentitive match on a range such as [Z-a]. It should match z, Z,
5154 a, A and the symbols [, \, ], ^, _, and `. This is not what happens with
5155 Boost.Regex (it throws an exception from the regex constructor).
5156 </p>
5157 <p>
5158 The tough pill to swallow is that, given the specification in TR1, I
5159 don't think there is any effective way to handle this situation.
5160 According to the spec, case-insensitivity is handled with
5161 regex_traits&lt;&gt;::translate_nocase(CharT) -- two characters are equivalent
5162 if they compare equal after both are sent through the translate_nocase
5163 function. But I don't see any way of using this translation function to
5164 make character ranges case-insensitive. Consider the difficulty of
5165 detecting whether "z" is in the range [Z-a]. Applying the transformation
5166 to "z" has no effect (it is essentially std::tolower). And we're not
5167 allowed to apply the transformation to the ends of the range, because as
5168 ECMA-262 says, "the case of the two ends of a range is significant."
5169 </p>
5170 <p>
5171 So AFAICT, TR1 regex is just broken, as is Boost.Regex. One possible fix
5172 is to redefine translate_nocase to return a string_type containing all
5173 the characters that should compare equal to the specified character. But
5174 this function is hard to implement for Unicode, and it doesn't play nice
5175 with the existing ctype facet. What a mess!
5176 </p>
5177 <p>
5178 -- End original message --
5179 </p>
5180
5181 <p><i>[
5182 John Maddock adds:
5183 ]</i></p>
5184
5185 <p>
5186 One small correction, I have since found that ICU's regex package does 
5187 implement this correctly, using a similar mechanism to the current 
5188 TR1.Regex.
5189 </p>
5190 <p>
5191 Given an expression [c1-c2] that is compiled as case insensitive it:
5192 </p>
5193 <p>
5194 Enumerates every character in the range c1 to c2 and converts it to it's 
5195 case folded equivalent.  That case folded character is then used a key to a 
5196 table of equivalence classes, and each member of the class is added to the 
5197 list of possible matches supported by the character-class.  This second step 
5198 isn't possible with our current traits class design, but isn't necessary if 
5199 the input text is also converted to a case-folded equivalent on the fly.
5200 </p>
5201 <p>
5202 ICU applies similar brute force mechanisms to character classes such as 
5203 [[:lower:]] and [[:word:]], however these are at least cached, so the impact 
5204 is less noticeable in this case.
5205 </p>
5206 <p>
5207 Quick and dirty performance comparisons show that expressions such as 
5208 "[X-\\x{fff0}]+" are indeed very slow to compile with ICU (about 200 times 
5209 slower than a "normal" expression).  For an application that uses a lot of 
5210 regexes this could have a noticeable performance impact.  ICU also has an 
5211 advantage in that it knows the range of valid characters codes: code points 
5212 outside that range are assumed not to require enumeration, as they can not 
5213 be part of any equivalence class.  I presume that if we want the TR1.Regex 
5214 to work with arbitrarily large character sets enumeration really does become 
5215 impractical.
5216 </p>
5217 <p>
5218 Finally note that Unicode has:
5219 </p>
5220 <p>
5221 Three cases (upper, lower and title).
5222 One to many, and many to one case transformations.
5223 Character that have context sensitive case translations - for example an 
5224 uppercase sigma has two different lowercase forms  - the form chosen depends 
5225 on context(is it end of a word or not), a caseless match for an upper case 
5226 sigma should match either of the lower case forms, which is why case folding 
5227 is often approximated by tolower(toupper(c)).
5228 </p>
5229 <p>
5230 Probably we need some way to enumerate character equivalence classes, 
5231 including digraphs (either as a result or an input), and some way to tell 
5232 whether the next character pair is a valid digraph in the current locale.
5233 </p>
5234 <p>
5235 Hoping this doesn't make this even more complex that it was already,
5236 </p>
5237
5238 <p><b>Proposed resolution:</b></p>
5239 <hr>
5240 <a name="524"><h3>524.&nbsp;regex named character classes and case-insensitivity don't mix</h3></a><p><b>Section:</b>&nbsp;TR1 7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.re"> [tr.re]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Eric Niebler&nbsp; <b>Date:</b>&nbsp;1 Jul 2005</p>
5241 <p>
5242 This defect is also being discussed on the Boost developers list. The 
5243 full discussion can be found here:
5244 http://lists.boost.org/boost/2005/07/29546.php
5245 </p>
5246 <p>
5247 -- Begin original message --
5248 </p>
5249 <p>
5250 Also, I may have found another issue, closely related to the one under
5251 discussion. It regards case-insensitive matching of named character
5252 classes. The regex_traits&lt;&gt; provides two functions for working with
5253 named char classes: lookup_classname and isctype. To match a char class
5254 such as [[:alpha:]], you pass "alpha" to lookup_classname and get a
5255 bitmask. Later, you pass a char and the bitmask to isctype and get a
5256 bool yes/no answer.
5257 </p>
5258 <p>
5259 But how does case-insensitivity work in this scenario? Suppose we're
5260 doing a case-insensitive match on [[:lower:]]. It should behave as if it
5261 were [[:lower:][:upper:]], right? But there doesn't seem to be enough
5262 smarts in the regex_traits interface to do this.
5263 </p>
5264 <p>
5265 Imagine I write a traits class which recognizes [[:fubar:]], and the
5266 "fubar" char class happens to be case-sensitive. How is the regex engine
5267 to know that? And how should it do a case-insensitive match of a
5268 character against the [[:fubar:]] char class? John, can you confirm this
5269 is a legitimate problem?
5270 </p>
5271 <p>
5272 I see two options:
5273 </p>
5274 <p>
5275 1) Add a bool icase parameter to lookup_classname. Then,
5276 lookup_classname( "upper", true ) will know to return lower|upper
5277 instead of just upper.
5278 </p>
5279 <p>
5280 2) Add a isctype_nocase function
5281 </p>
5282 <p>
5283 I prefer (1) because the extra computation happens at the time the
5284 pattern is compiled rather than when it is executed.
5285 </p>
5286 <p>
5287 -- End original message --
5288 </p>
5289
5290 <p>
5291 For what it's worth, John has also expressed his preference for option 
5292 (1) above.
5293 </p>
5294 <p><b>Proposed resolution:</b></p>
5295 <hr>
5296 <a name="525"><h3>525.&nbsp;type traits definitions not clear</h3></a><p><b>Section:</b>&nbsp;TR1 4.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.meta.unary"> [tr.meta.unary]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Robert Klarer&nbsp; <b>Date:</b>&nbsp;11 Jul 2005</p>
5297 <p>
5298 It is not completely clear how the primary type traits deal with
5299 cv-qualified types.  And several of the secondary type traits
5300 seem to be lacking a definition.
5301 </p>
5302 <p><b>Proposed resolution:</b></p>
5303 <hr>
5304 <a name="526"></a><h3><a name="526">526.&nbsp;Is it undefined if a function in the standard changes in parameters?</a></h3><p><b>Section:</b>&nbsp;23.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.sequence.reqmts"> [lib.sequence.reqmts]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Chris Jefferson&nbsp; <b>Date:</b>&nbsp;14 Sep 2005</p>
5305 <p>
5306 Problem: There are a number of places in the C++ standard library where
5307 it is possible to write what appear to be sensible ways of calling
5308 functions, but which can cause problems in some (or all)
5309 implementations, as they cause the values given to the function to be
5310 changed in a way not specified in standard (and therefore not coded to
5311 correctly work). These fall into two similar categories.
5312 </p>
5313
5314 <p>
5315 1) Parameters taken by const reference can be changed during execution
5316 of the function
5317 </p>
5318
5319 <p>
5320 Examples:
5321 </p>
5322
5323 <p>
5324 Given std::vector&lt;int&gt; v:
5325 </p>
5326 <p>
5327 v.insert(v.begin(), v[2]);
5328 </p>
5329 <p>
5330 v[2] can be changed by moving elements of vector
5331 </p>
5332
5333
5334 <p>
5335 Given std::list&lt;int&gt; l:
5336 </p>
5337 <p>
5338 l.remove(*l.begin());
5339 </p>
5340 <p>
5341 Will delete the first element, and then continue trying to access it.
5342 This is particularily vicious, as it will appear to work in almost all
5343 cases.
5344 </p>
5345
5346 <p>
5347 2) A range is given which changes during the execution of the function:
5348 Similarly,
5349 </p>
5350
5351 <p>
5352 v.insert(v.begin(), v.begin()+4, v.begin()+6);
5353 </p>
5354
5355 <p>
5356 This kind of problem has been partly covered in some cases. For example
5357 std::copy(first, last, result) states that result cannot be in the range
5358 [first, last). However, does this cover the case where result is a
5359 reverse_iterator built from some iterator in the range [first, last)?
5360 Also, std::copy would still break if result was reverse_iterator(last +
5361 1), yet this is not forbidden by the standard
5362 </p>
5363
5364 <p>
5365 Solution:
5366 </p>
5367
5368 <p>
5369 One option would be to try to more carefully limit the requirements of
5370 each function. There are many functions which would have to be checked.
5371 However as has been shown in the std::copy case, this may be difficult.
5372 A simpler, more global option would be to somewhere insert text similar to:
5373 </p>
5374
5375 <p>
5376 If the execution of any function would change either any values passed
5377 by reference or any value in any range passed to a function in a way not
5378 defined in the definition of that function, the result is undefined.
5379 </p>
5380
5381 <p>
5382 Such code would have to at least cover chapters 23 and 25 (the sections
5383 I read through carefully). I can see no harm on applying it to much of
5384 the rest of the standard.
5385 </p>
5386
5387 <p>
5388 Some existing parts of the standard could be improved to fit with this,
5389 for example the requires for 25.2.1 (Copy) could be adjusted to:
5390 </p>
5391
5392 <p>
5393 Requires: For each non-negative integer n &lt; (last - first), assigning to
5394 *(result + n) must not alter any value in the range [first + n, last).
5395 </p>
5396
5397 <p>
5398 However, this may add excessive complication.
5399 </p>
5400
5401 <p>
5402 One other benefit of clearly introducing this text is that it would
5403 allow a number of small optimisations, such as caching values passed
5404 by const reference.
5405 </p>
5406
5407 <p><b>Proposed resolution:</b></p>
5408 <p>
5409 </p>
5410 <hr>
5411 <a name="527"><h3>527.&nbsp;tr1::bind has lost its Throws clause</h3></a><p><b>Section:</b>&nbsp;TR1 3.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.func.bind.bind"> [tr.func.bind.bind]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Peter Dimov&nbsp; <b>Date:</b>&nbsp;01 Oct 2005</p>
5412 <p>
5413 The original bind proposal gives the guarantee that tr1::bind(f, t1,
5414 ..., tN) does not throw when the copy constructors of f, t1, ..., tN
5415 don't.
5416 </p>
5417
5418 <p>
5419 This guarantee is not present in the final version of TR1.
5420 </p>
5421
5422 <p>
5423 I'm pretty certain that we never removed it on purpose. Editorial omission? :-)
5424 </p>
5425 <p><b>Proposed resolution:</b></p>
5426 <p>
5427 </p>
5428 <hr>
5429 <a name="528"><h3>528.&nbsp;TR1: issue 6.19 vs 6.3.4.3/2 (and 6.3.4.5/2)</h3></a><p><b>Section:</b>&nbsp;TR1 6.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/tr1.html#tr.unord.unord"> [tr.unord.unord]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#New">New</a>&nbsp; <b>Submitter:</b>&nbsp;Paolo Carlini&nbsp; <b>Date:</b>&nbsp;12 Oct 2005</p>
5430 <p>
5431 while implementing the resolution of issue 6.19 I'm noticing the
5432 following: according to 6.3.4.3/2 (and 6.3.4.5/2), for unordered_set and
5433 unordered_multiset:
5434 </p>
5435
5436 <blockquote>
5437     "The iterator and const_iterator types are both const types. It is
5438 unspecified whether they are the same type"
5439 </blockquote>
5440
5441 <p>
5442 Now, according to the resolution of 6.19, we have overloads of insert
5443 with hint and erase (single and range) both for iterator and
5444 const_iterator, which, AFAICS, can be meaningful at the same time *only*
5445 if iterator and const_iterator *are* in fact different types.
5446 </p>
5447 <p>
5448 Then, iterator and const_iterator are *required* to be different types?
5449 Or that is an unintended consequence? Maybe the overloads for plain
5450 iterators should be added only to unordered_map and unordered_multimap?
5451 Or, of course, I'm missing something?
5452 </p>
5453
5454 <p><b>Proposed resolution:</b></p>
5455 <p>
5456 Add to 6.3.4.3p2 (and 6.3.4.5p2):
5457 </p>
5458 <p>
5459 2  ... The iterator and const_iterator types are both <del>const</del>
5460 <ins>constant</ins> iterator types.
5461 It is unspecified whether they are the same type. <ins>If they are the
5462 same type, those signatures that become otherwise indistinguishable
5463 collapse into a single signature.</ins>
5464 </p>
5465
5466 <p>----- End of document -----</p>
5467 </body></html>