Remove old autovect-branch by moving to "dead" directory.
[official-gcc.git] / old-autovect-branch / libstdc++-v3 / docs / html / ext / lwg-defects.html
blob380c85e70e66222536b609daf51fb94b93d1c6ed
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 Defect Report List</title></head>
4 <body bgcolor="#ffffff" text="#000000">
5 <table>
6 <tbody><tr>
7 <td align="left">Doc. no.</td>
8 <td align="left">N1909=05-0169</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 Defect Report 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-active.html">Library Active Issues 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>This document contains only library issues which have been closed
37 by the Library Working Group (LWG) after being found to be defects
38 in the standard. That is, issues which have a status of <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>, or <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#RR">RR</a>. See the
39 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html">Library Closed Issues List</a> for issues closed as non-defects. See the
40 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html">Library Active Issues List</a> for active issues and more information. The
41 introductory material in that document also applies to this
42 document.</p>
43 <h2>Revision History</h2>
44 <ul>
45 <li>R39:
46 2005-10-14 post-Mont Tremblant mailing.
47 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>.
48 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.
49 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.
50 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.
51 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.
52 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#500">500</a> from New to NAD.
53 Moved issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#518">518</a> from New to Review.
54 </li>
55 <li>R38:
56 2005-07-03 pre-Mont Tremblant mailing.
57 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>.
58 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>
59 </li>
60 <li>R37:
61 2005-06 mid-term mailing.
62 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>.
63 </li>
64 <li>R36:
65 2005-04 post-Lillehammer mailing. All issues in "ready" status except
66 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
67 previously in "DR" status were moved to "WP".
68 </li>
69 <li>R35:
70 2005-03 pre-Lillehammer mailing.
71 </li>
72 <li>R34:
73 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>.
74 </li>
75 <li>R33:
76 2004-11 post-Redmond mailing. Reflects actions taken in Redmond.
77 </li>
78 <li>R32:
79 2004-09 pre-Redmond mailing: reflects new proposed resolutions and
80 new issues received after the 2004-07 mailing. Added
81 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>.
82 </li>
83 <li>R31:
84 2004-07 mid-term mailing: reflects new proposed resolutions and
85 new issues received after the post-Sydney mailing. Added
86 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>.
87 </li>
88 <li>R30:
89 Post-Sydney mailing: reflects decisions made at the Sydney meeting.
90 Voted all "Ready" issues from R29 into the working paper.
91 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>.
92 </li>
93 <li>R29:
94 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>.
95 </li>
96 <li>R28:
97 Post-Kona mailing: reflects decisions made at the Kona meeting.
98 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>.
99 </li>
100 <li>R27:
101 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>.
102 </li>
103 <li>R26:
104 Post-Oxford mailing: reflects decisions made at the Oxford meeting.
105 All issues in Ready status were voted into DR status. All issues in
106 DR status were voted into WP status.
107 </li>
108 <li>R25:
109 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>.
110 </li>
111 <li>R24:
112 Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz
113 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
114 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
115 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
116 concerns with <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a> involve wording.
117 </li>
118 <li>R23:
119 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>.
120 Moved issues in the TC to TC status.
121 </li>
122 <li>R22:
123 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>.
124 </li>
125 <li>R21:
126 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>.
127 </li>
128 <li>R20:
129 Post-Redmond mailing; reflects actions taken in Redmond. Added
130 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
131 <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
132 not discussed at the meeting.
134 All Ready issues were moved to DR status, with the exception of issues
135 <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>.
137 Noteworthy issues discussed at Redmond include
138 <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>,
139 <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>.
140 </li>
141 <li>R19:
142 Pre-Redmond mailing. Added new issues
143 <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>.
144 </li>
145 <li>R18:
146 Post-Copenhagen mailing; reflects actions taken in Copenhagen.
147 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
148 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>.
150 Changed status of issues
151 <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>
152 <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>
153 <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>
154 <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>
155 <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>
156 <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>
157 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#268">268</a>
158 to DR.
160 Changed status of issues
161 <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>
162 <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>
163 <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>
164 <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>
165 <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>
166 <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>
167 <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>
168 <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>
169 <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>
170 to Ready.
172 Closed issues
173 <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>
174 <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>
175 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#314">314</a>
176 as NAD.
178 </li>
179 <li>R17:
180 Pre-Copenhagen mailing. Converted issues list to XML. Added proposed
181 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>.
182 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>.
183 </li>
184 <li>R16:
185 post-Toronto mailing; reflects actions taken in Toronto. Added new
186 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
187 <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>,
188 <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>,
189 <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>,
190 <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>,
191 <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>,
192 <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>,
193 <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>,
194 <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>,
195 <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>,
196 <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>,
197 <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>,
198 <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>,
199 <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
200 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
201 <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
202 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
203 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
204 the bug in enough places.
205 </li>
206 <li>R15:
207 pre-Toronto mailing. Added issues
208 <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
209 changes so that we pass Weblint tests.
210 </li>
211 <li>R14:
212 post-Tokyo II mailing; reflects committee actions taken in
213 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)
214 </li>
215 <li>R13:
216 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>.
217 </li>
218 <li>R12:
219 pre-Tokyo II mailing: Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#199">199</a> to
220 <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
221 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#29">29</a>. Add further rationale to issue
222 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#178">178</a>.
223 </li>
224 <li>R11:
225 post-Kona mailing: Updated to reflect LWG and full committee actions
226 in Kona (99-0048/N1224). Note changed resolution of issues
227 <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>
228 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
229 "closed" documents. Changed the proposed resolution of issue
230 <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
231 of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#38">38</a>.
232 </li>
233 <li>R10:
234 pre-Kona updated. Added proposed resolutions <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</a>,
235 <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>,
236 <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
237 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#195">195</a>. (99-0033/D1209, 14 Oct 99)
238 </li>
239 <li>R9:
240 pre-Kona mailing. Added issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a> to
241 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#189">189</a>. Issues list split into separate "active" and
242 "closed" documents. (99-0030/N1206, 25 Aug 99)
243 </li>
244 <li>R8:
245 post-Dublin mailing. Updated to reflect LWG and full committee actions
246 in Dublin. (99-0016/N1193, 21 Apr 99)
247 </li>
248 <li>R7:
249 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>,
250 <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>,
251 <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>,
252 <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)
253 </li>
254 <li>R6:
255 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>,
256 and <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#129">129</a>. (99-0007/N1194, 22 Feb 99)
257 </li>
258 <li>R5:
259 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
260 <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
261 for making list public. (30 Dec 98)
262 </li>
263 <li>R4:
264 post-Santa Cruz II updated: Issues <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#110">110</a>,
265 <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
266 issues corrected. (22 Oct 98)
267 </li>
268 <li>R3:
269 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>
270 added, many issues updated to reflect LWG consensus (12 Oct 98)
271 </li>
272 <li>R2:
273 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,
274 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#17">17</a> updated. (29 Sep 98)
275 </li>
276 <li>R1:
277 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
278 format, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#64">64</a> title. (17 Sep 98)
279 </li>
280 </ul>
281 <h2>Defect Reports</h2>
282 <hr>
283 <a name="1"><h3>1.&nbsp;C library linkage editing oversight</h3></a><p><b>Section:</b>&nbsp;17.4.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.using.linkage"> [lib.using.linkage]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;16 Nov 1997</p>
284 <p>The change specified in the proposed resolution below did not make
285 it into the Standard. This change was accepted in principle at the
286 London meeting, and the exact wording below was accepted at the
287 Morristown meeting.</p>
288 <p><b>Proposed resolution:</b></p>
289 <p>Change 17.4.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.using.linkage"> [lib.using.linkage]</a> paragraph 2
290 from:</p>
292 <blockquote>
293 <p>It is unspecified whether a name from the Standard C library
294 declared with external linkage has either extern "C" or
295 extern "C++" linkage.</p>
296 </blockquote>
298 <p>to:</p>
300 <blockquote>
301 <p>Whether a name from the Standard C library declared with external
302 linkage has extern "C" or extern "C++" linkage
303 is implementation defined. It is recommended that an implementation
304 use extern "C++" linkage for this purpose.</p>
305 </blockquote>
306 <hr>
307 <a name="3"><h3>3.&nbsp;Atexit registration during atexit() call is not described</h3></a><p><b>Section:</b>&nbsp;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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;12 Dec 1997</p>
308 <p>We appear not to have covered all the possibilities of
309 exit processing with respect to
310 atexit registration. <br>
311 <br>
312 Example 1: (C and C++)</p>
314 <pre> #include &lt;stdlib.h&gt;
315 void f1() { }
316 void f2() { atexit(f1); }
318 int main()
320 atexit(f2); // the only use of f2
321 return 0; // for C compatibility
322 }</pre>
324 <p>At program exit, f2 gets called due to its registration in
325 main. Running f2 causes f1 to be newly registered during the exit
326 processing. Is this a valid program? If so, what are its
327 semantics?</p>
330 Interestingly, neither the C standard, nor the C++ draft standard nor
331 the forthcoming C9X Committee Draft says directly whether you can
332 register a function with atexit during exit processing.</p>
335 All 3 standards say that functions are run in reverse order of their
336 registration. Since f1 is registered last, it ought to be run first,
337 but by the time it is registered, it is too late to be first.</p>
339 <p>If the program is valid, the standards are self-contradictory about
340 its semantics.</p>
342 <p>Example 2: (C++ only)</p>
344 <pre>
345 void F() { static T t; } // type T has a destructor
347 int main()
349 atexit(F); // the only use of F
351 </pre>
353 <p>Function F registered with atexit has a local static variable t,
354 and F is called for the first time during exit processing. A local
355 static object is initialized the first time control flow passes
356 through its definition, and all static objects are destroyed during
357 exit processing. Is the code valid? If so, what are its semantics?</p>
360 Section 18.3 "Start and termination" says that if a function
361 F is registered with atexit before a static object t is initialized, F
362 will not be called until after t's destructor completes.</p>
365 In example 2, function F is registered with atexit before its local
366 static object O could possibly be initialized. On that basis, it must
367 not be called by exit processing until after O's destructor
368 completes. But the destructor cannot be run until after F is called,
369 since otherwise the object could not be constructed in the first
370 place.</p>
372 <p>If the program is valid, the standard is self-contradictory about
373 its semantics.</p>
375 <p>I plan to submit Example 1 as a public comment on the C9X CD, with
376 a recommendation that the results be undefined. (Alternative: make it
377 unspecified. I don't think it is worthwhile to specify the case where
378 f1 itself registers additional functions, each of which registers
379 still more functions.)</p>
381 <p>I think we should resolve the situation in the whatever way the C
382 committee decides. </p>
384 <p>For Example 2, I recommend we declare the results undefined.</p>
386 <p><i>[See reflector message lib-6500 for further discussion.]</i></p>
388 <p><b>Proposed resolution:</b></p>
389 <p>Change section 18.3/8 from:</p>
390 <blockquote>
391 First, objects with static storage duration are destroyed and
392 functions registered by calling atexit are called. Objects with
393 static storage duration are destroyed in the reverse order of the
394 completion of their constructor. (Automatic objects are not
395 destroyed as a result of calling exit().) Functions registered with
396 atexit are called in the reverse order of their registration. A
397 function registered with atexit before an object obj1 of static
398 storage duration is initialized will not be called until obj1's
399 destruction has completed. A function registered with atexit after
400 an object obj2 of static storage duration is initialized will be
401 called before obj2's destruction starts.
402 </blockquote>
403 <p>to:</p>
404 <blockquote>
405 First, objects with static storage duration are destroyed and
406 functions registered by calling atexit are called. Non-local objects
407 with static storage duration are destroyed in the reverse order of
408 the completion of their constructor. (Automatic objects are not
409 destroyed as a result of calling exit().) Functions registered with
410 atexit are called in the reverse order of their registration, except
411 that a function is called after any previously registered functions
412 that had already been called at the time it was registered. A
413 function registered with atexit before a non-local object obj1 of
414 static storage duration is initialized will not be called until
415 obj1's destruction has completed. A function registered with atexit
416 after a non-local object obj2 of static storage duration is
417 initialized will be called before obj2's destruction starts. A local
418 static object obj3 is destroyed at the same time it would be if a
419 function calling the obj3 destructor were registered with atexit at
420 the completion of the obj3 constructor.
421 </blockquote>
422 <p><b>Rationale:</b></p>
423 <p>See 99-0039/N1215, October 22, 1999, by Stephen D. Clamage for the analysis
424 supporting to the proposed resolution.</p>
425 <hr>
426 <a name="5"><h3>5.&nbsp;String::compare specification questionable</h3></a><p><b>Section:</b>&nbsp;21.3.6.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::compare"> [lib.string::compare]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Jack Reeves&nbsp; <b>Date:</b>&nbsp;11 Dec 1997</p>
427 <p>At the very end of the basic_string class definition is the signature: int
428 compare(size_type pos1, size_type n1, const charT* s, size_type n2 = npos) const; In the
429 following text this is defined as: returns
430 basic_string&lt;charT,traits,Allocator&gt;(*this,pos1,n1).compare(
431 basic_string&lt;charT,traits,Allocator&gt;(s,n2); </p>
433 <p>Since the constructor basic_string(const charT* s, size_type n, const Allocator&amp; a
434 = Allocator()) clearly requires that s != NULL and n &lt; npos and further states that it
435 throws length_error if n == npos, it appears the compare() signature above should always
436 throw length error if invoked like so: str.compare(1, str.size()-1, s); where 's' is some
437 null terminated character array. </p>
439 <p>This appears to be a typo since the obvious intent is to allow either the call above or
440 something like: str.compare(1, str.size()-1, s, strlen(s)-1); </p>
442 <p>This would imply that what was really intended was two signatures int compare(size_type
443 pos1, size_type n1, const charT* s) const int compare(size_type pos1, size_type n1, const
444 charT* s, size_type n2) const; each defined in terms of the corresponding constructor. </p>
445 <p><b>Proposed resolution:</b></p>
446 <p>Replace the compare signature in 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>
447 (at the very end of the basic_string synopsis) which reads:</p>
449 <blockquote>
450 <p><tt>int compare(size_type pos1, size_type n1,<br>
451 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const charT* s,
452 size_type n2 = npos) const;</tt></p>
453 </blockquote>
455 <p>with:</p>
457 <blockquote>
458 <p><tt>int compare(size_type pos1, size_type n1,<br>
459 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const charT* s) const;<br>
460 int compare(size_type pos1, size_type n1,<br>
461 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const charT* s,
462 size_type n2) const;</tt></p>
463 </blockquote>
465 <p>Replace the portion of 21.3.6.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::compare"> [lib.string::compare]</a>
466 paragraphs 5 and 6 which read:</p>
468 <blockquote>
469 <p><tt>int compare(size_type pos, size_type n1,<br>
470 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; charT * s, size_type n2
471 = npos) const;<br>
472 </tt>Returns:<tt><br>
473 basic_string&lt;charT,traits,Allocator&gt;(*this, pos, n1).compare(<br>
474 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
475 basic_string&lt;charT,traits,Allocator&gt;( s, n2))</tt></p>
476 </blockquote>
478 <p>with:</p>
480 <blockquote>
481 <p><tt>int compare(size_type pos, size_type n1,<br>
482 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const charT * s) const;<br>
483 </tt>Returns:<tt><br>
484 basic_string&lt;charT,traits,Allocator&gt;(*this, pos, n1).compare(<br>
485 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
486 basic_string&lt;charT,traits,Allocator&gt;( s ))<br>
487 <br>
488 int compare(size_type pos, size_type n1,<br>
489 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const charT * s,
490 size_type n2) const;<br>
491 </tt>Returns:<tt><br>
492 basic_string&lt;charT,traits,Allocator&gt;(*this, pos, n1).compare(<br>
493 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
494 basic_string&lt;charT,traits,Allocator&gt;( s, n2))</tt></p>
495 </blockquote>
497 <p>Editors please note that in addition to splitting the signature, the third argument
498 becomes const, matching the existing synopsis.</p>
499 <p><b>Rationale:</b></p>
500 <p>While the LWG dislikes adding signatures, this is a clear defect in
501 the Standard which must be fixed.&nbsp; The same problem was also
502 identified in issues 7 (item 5) and 87.</p>
503 <hr>
504 <a name="7"><h3>7.&nbsp;String clause minor problems</h3></a><p><b>Section:</b>&nbsp;21 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.strings"> [lib.strings]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;15 Dec 1997</p>
505 <p>(1) In 21.3.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::insert"> [lib.string::insert]</a>, the description of template
506 &lt;class InputIterator&gt; insert(iterator, InputIterator,
507 InputIterator) makes no sense. It refers to a member function that
508 doesn't exist. It also talks about the return value of a void
509 function. </p>
511 <p>(2) Several versions of basic_string::replace don't appear in the
512 class synopsis. </p>
514 <p>(3) basic_string::push_back appears in the synopsis, but is never
515 described elsewhere. In the synopsis its argument is const charT,
516 which doesn't makes much sense; it should probably be charT, or
517 possible const charT&amp;. </p>
519 <p>(4) basic_string::pop_back is missing. </p>
521 <p>(5) int compare(size_type pos, size_type n1, charT* s, size_type n2
522 = npos) make no sense. First, it's const charT* in the synopsis and
523 charT* in the description. Second, given what it says in RETURNS,
524 leaving out the final argument will always result in an exception
525 getting thrown. This is paragraphs 5 and 6 of
526 21.3.6.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::compare"> [lib.string::compare]</a></p>
528 <p>(6) In table 37, in section 21.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.require"> [lib.char.traits.require]</a>,
529 there's a note for X::move(s, p, n). It says "Copies correctly
530 even where p is in [s, s+n)". This is correct as far as it goes,
531 but it doesn't go far enough; it should also guarantee that the copy
532 is correct even where s in in [p, p+n). These are two orthogonal
533 guarantees, and neither one follows from the other. Both guarantees
534 are necessary if X::move is supposed to have the same sort of
535 semantics as memmove (which was clearly the intent), and both
536 guarantees are necessary if X::move is actually supposed to be
537 useful. </p>
538 <p><b>Proposed resolution:</b></p>
539 <p>ITEM 1: In 21.3.5.4 [lib.string::insert], change paragraph 16 to <br>
540 <br>
541 &nbsp;&nbsp;&nbsp; EFFECTS: Equivalent to insert(p - begin(), basic_string(first, last)).<br>
542 <br>
543 ITEM 2:&nbsp; Not a defect; the Standard is clear.. There are ten versions of replace() in
544 the synopsis, and ten versions in 21.3.5.6 [lib.string::replace].<br>
545 <br>
546 ITEM 3: Change the declaration of push_back in the string synopsis (21.3,
547 [lib.basic.string]) from:</p>
549 <p>&nbsp;&nbsp;&nbsp;&nbsp; void push_back(const charT)<br>
550 <br>
551 to<br>
552 <br>
553 &nbsp;&nbsp;&nbsp;&nbsp; void push_back(charT)<br>
554 <br>
555 Add the following text immediately after 21.3.5.2 [lib.string::append], paragraph 10.<br>
556 <br>
557 &nbsp;&nbsp;&nbsp; void basic_string::push_back(charT c);<br>
558 &nbsp;&nbsp;&nbsp; EFFECTS: Equivalent to append(static_cast&lt;size_type&gt;(1), c);<br>
559 <br>
560 ITEM 4: Not a defect. The omission appears to have been deliberate.<br>
561 <br>
562 ITEM 5: Duplicate; see issue 5 (and 87).<br>
563 <br>
564 ITEM 6: In table 37, Replace:<br>
565 <br>
566 &nbsp;&nbsp;&nbsp; "Copies correctly even where p is in [s, s+n)."<br>
567 <br>
568 with:<br>
569 <br>
570 &nbsp;&nbsp;&nbsp;&nbsp; "Copies correctly even where the ranges [p, p+n) and [s,
571 s+n) overlap."</p>
572 <hr>
573 <a name="8"><h3>8.&nbsp;Locale::global lacks guarantee</h3></a><p><b>Section:</b>&nbsp;22.1.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.statics"> [lib.locale.statics]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;24 Dec 1997</p>
574 <p>It appears there's an important guarantee missing from clause
575 22. We're told that invoking locale::global(L) sets the C locale if L
576 has a name. However, we're not told whether or not invoking
577 setlocale(s) sets the global C++ locale. </p>
579 <p>The intent, I think, is that it should not, but I can't find any
580 such words anywhere. </p>
581 <p><b>Proposed resolution:</b></p>
582 <p>Add a sentence at the end of 22.1.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.statics"> [lib.locale.statics]</a>,
583 paragraph 2:&nbsp; </p>
585 <blockquote>
586 <p>No library function other than <tt>locale::global()</tt> shall affect
587 the value returned by <tt>locale()</tt>. </p>
589 </blockquote>
590 <hr>
591 <a name="9"><h3>9.&nbsp;Operator new(0) calls should not yield the same pointer</h3></a><p><b>Section:</b>&nbsp;18.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete"> [lib.new.delete]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;4 Jan 1998</p>
592 <p>Scott Meyers, in a comp.std.c++ posting: I just noticed that
593 section 3.7.3.1 of CD2 seems to allow for the possibility that all
594 calls to operator new(0) yield the same pointer, an implementation
595 technique specifically prohibited by ARM 5.3.3.Was this prohibition
596 really lifted? Does the FDIS agree with CD2 in the regard? [Issues
597 list maintainer's note: the IS is the same.]</p>
598 <p><b>Proposed resolution:</b></p>
599 <p>Change the last paragraph of 3.7.3 from:</p>
600 <blockquote>
601 <p>Any allocation and/or deallocation functions defined in a C++ program shall
602 conform to the semantics specified in 3.7.3.1 and 3.7.3.2.</p>
603 </blockquote>
604 <p>to:</p>
605 <blockquote>
606 <p>Any allocation and/or deallocation functions defined in a C++ program,
607 including the default versions in the library, shall conform to the semantics
608 specified in 3.7.3.1 and 3.7.3.2.</p>
609 </blockquote>
610 <p>Change 3.7.3.1/2, next-to-last sentence, from :</p>
611 <blockquote>
612 <p>If the size of the space requested is zero, the value returned shall not be
613 a null pointer value (4.10).</p>
614 </blockquote>
615 <p>to:</p>
616 <blockquote>
617 <p>Even if the size of the space requested is zero, the request can fail. If
618 the request succeeds, the value returned shall be a non-null pointer value
619 (4.10) p0 different from any previously returned value p1, unless that value
620 p1 was since passed to an operator delete.</p>
621 </blockquote>
622 <p>5.3.4/7 currently reads:</p>
623 <blockquote>
624 <p>When the value of the expression in a direct-new-declarator is zero, the
625 allocation function is called to allocate an array with no elements. The
626 pointer returned by the new-expression is non-null. [Note: If the library
627 allocation function is called, the pointer returned is distinct from the
628 pointer to any other object.]</p>
629 </blockquote>
630 <p>Retain the first sentence, and delete the remainder.</p>
631 <p>18.4.1 currently has no text. Add the following:</p>
632 <blockquote>
633 <p>Except where otherwise specified, the provisions of 3.7.3 apply to the
634 library versions of operator new and operator delete.</p>
635 </blockquote>
636 <p>To 18.4.1.3, add the following text:</p>
637 <blockquote>
638 <p>The provisions of 3.7.3 do not apply to these reserved placement forms of
639 operator new and operator delete.</p>
640 </blockquote>
641 <p><b>Rationale:</b></p>
642 <p>See 99-0040/N1216, October 22, 1999, by Stephen D. Clamage for the analysis
643 supporting to the proposed resolution.</p>
644 <hr>
645 <a name="11"><h3>11.&nbsp;Bitset minor problems</h3></a><p><b>Section:</b>&nbsp;23.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.template.bitset"> [lib.template.bitset]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;22 Jan 1998</p>
646 <p>(1) bitset&lt;&gt;::operator[] is mentioned in the class synopsis (23.3.5), but it is
647 not documented in 23.3.5.2. </p>
649 <p>(2) The class synopsis only gives a single signature for bitset&lt;&gt;::operator[],
650 reference operator[](size_t pos). This doesn't make much sense. It ought to be overloaded
651 on const. reference operator[](size_t pos); bool operator[](size_t pos) const. </p>
653 <p>(3) Bitset's stream input function (23.3.5.3) ought to skip all whitespace before
654 trying to extract 0s and 1s. The standard doesn't explicitly say that, though. This should
655 go in the Effects clause.</p>
656 <p><b>Proposed resolution:</b></p>
657 <p>ITEMS 1 AND 2:<br>
658 <br>
659 In the bitset synopsis (23.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.template.bitset"> [lib.template.bitset]</a>),
660 replace the member function <br>
661 <br>
662 <tt>&nbsp;&nbsp;&nbsp; reference operator[](size_t pos);<br>
663 </tt><br>
664 with the two member functions<br>
665 <br>
666 <tt>&nbsp;&nbsp;&nbsp; bool operator[](size_t pos) const; <br>
667 &nbsp;&nbsp;&nbsp; reference operator[](size_t pos); <br>
668 </tt><br>
669 Add the following text at the end 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>,
670 immediately after paragraph 45:</p>
672 <blockquote>
673 <p><tt>bool operator[](size_t pos) const;</tt><br>
674 Requires: pos is valid<br>
675 Throws: nothing<br>
676 Returns: <tt>test(pos)</tt><br>
677 <br>
678 <tt>bitset&lt;N&gt;::reference operator[](size_t pos);</tt> <br>
679 Requires: pos is valid<br>
680 Throws: nothing<br>
681 Returns: An object of type <tt>bitset&lt;N&gt;::reference</tt> such that <tt>(*this)[pos]
682 == this-&gt;test(pos)</tt>, and such that <tt>(*this)[pos] = val</tt> is equivalent to <tt>this-&gt;set(pos,
683 val);</tt></p>
684 </blockquote>
685 <p><b>Rationale:</b></p>
686 <p>The LWG believes Item 3 is not a defect. "Formatted
687 input" implies the desired semantics. See 27.6.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted"> [lib.istream.formatted]</a>.
688 </p>
689 <hr>
690 <a name="13"><h3>13.&nbsp;Eos refuses to die</h3></a><p><b>Section:</b>&nbsp;27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;William M. Miller&nbsp; <b>Date:</b>&nbsp;3 Mar 1998</p>
691 <p>In 27.6.1.2.3, there is a reference to "eos", which is
692 the only one in the whole draft (at least using Acrobat search), so
693 it's undefined. </p>
694 <p><b>Proposed resolution:</b></p>
695 <p>In 27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>, replace "eos" with
696 "charT()"</p>
697 <hr>
698 <a name="14"><h3>14.&nbsp;Locale::combine should be const</h3></a><p><b>Section:</b>&nbsp;22.1.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.members"> [lib.locale.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
699 <p>locale::combine is the only member function of locale (other than constructors and
700 destructor) that is not const. There is no reason for it not to be const, and good reasons
701 why it should have been const. Furthermore, leaving it non-const conflicts with 22.1.1
702 paragraph 6: "An instance of a locale is immutable." </p>
704 <p>History: this member function originally was a constructor. it happened that the
705 interface it specified had no corresponding language syntax, so it was changed to a member
706 function. As constructors are never const, there was no "const" in the interface
707 which was transformed into member "combine". It should have been added at that
708 time, but the omission was not noticed. </p>
709 <p><b>Proposed resolution:</b></p>
710 <p>In 22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a> and also in 22.1.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.members"> [lib.locale.members]</a>, add
711 "const" to the declaration of member combine: </p>
712 <blockquote>
713 <pre>template &lt;class Facet&gt; locale combine(const locale&amp; other) const; </pre>
714 </blockquote>
715 <hr>
716 <a name="15"><h3>15.&nbsp;Locale::name requirement inconsistent</h3></a><p><b>Section:</b>&nbsp;22.1.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.members"> [lib.locale.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
717 <p>locale::name() is described as returning a string that can be passed to a locale
718 constructor, but there is no matching constructor. </p>
719 <p><b>Proposed resolution:</b></p>
720 <p>In 22.1.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.members"> [lib.locale.members]</a>, paragraph 5, replace
721 "<tt>locale(name())</tt>" with
722 "<tt>locale(name().c_str())</tt>".
723 </p>
724 <hr>
725 <a name="16"><h3>16.&nbsp;Bad ctype_byname&lt;char&gt; decl</h3></a><p><b>Section:</b>&nbsp;22.2.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname.special"> [lib.locale.ctype.byname.special]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
726 <p>The new virtual members ctype_byname&lt;char&gt;::do_widen and do_narrow did not get
727 edited in properly. Instead, the member do_widen appears four times, with wrong argument
728 lists. </p>
729 <p><b>Proposed resolution:</b></p>
730 <p>The correct declarations for the overloaded members
731 <tt>do_narrow</tt> and <tt>do_widen</tt> should be copied
732 from 22.2.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.special"> [lib.facet.ctype.special]</a>.</p>
733 <hr>
734 <a name="17"><h3>17.&nbsp;Bad bool parsing</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
735 <p>This section describes the process of parsing a text boolean value from the input
736 stream. It does not say it recognizes either of the sequences "true" or
737 "false" and returns the corresponding bool value; instead, it says it recognizes
738 only one of those sequences, and chooses which according to the received value of a
739 reference argument intended for returning the result, and reports an error if the other
740 sequence is found. (!) Furthermore, it claims to get the names from the ctype&lt;&gt;
741 facet rather than the numpunct&lt;&gt; facet, and it examines the "boolalpha"
742 flag wrongly; it doesn't define the value "loc"; and finally, it computes
743 wrongly whether to use numeric or "alpha" parsing.<br>
744 <br>
745 I believe the correct algorithm is "as if": </p>
747 <pre> // in, err, val, and str are arguments.
748 err = 0;
749 const numpunct&lt;charT&gt;&amp; np = use_facet&lt;numpunct&lt;charT&gt; &gt;(str.getloc());
750 const string_type t = np.truename(), f = np.falsename();
751 bool tm = true, fm = true;
752 size_t pos = 0;
753 while (tm &amp;&amp; pos &lt; t.size() || fm &amp;&amp; pos &lt; f.size()) {
754 if (in == end) { err = str.eofbit; }
755 bool matched = false;
756 if (tm &amp;&amp; pos &lt; t.size()) {
757 if (!err &amp;&amp; t[pos] == *in) matched = true;
758 else tm = false;
760 if (fm &amp;&amp; pos &lt; f.size()) {
761 if (!err &amp;&amp; f[pos] == *in) matched = true;
762 else fm = false;
764 if (matched) { ++in; ++pos; }
765 if (pos &gt; t.size()) tm = false;
766 if (pos &gt; f.size()) fm = false;
768 if (tm == fm || pos == 0) { err |= str.failbit; }
769 else { val = tm; }
770 return in;</pre>
772 <p>Notice this works reasonably when the candidate strings are both empty, or equal, or
773 when one is a substring of the other. The proposed text below captures the logic of the
774 code above.</p>
775 <p><b>Proposed resolution:</b></p>
776 <p>In 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>, in the first line of paragraph 14,
777 change "&amp;&amp;" to "&amp;".</p>
779 <p>Then, replace paragraphs 15 and 16 as follows:</p>
781 <blockquote>
783 <p>Otherwise target sequences are determined "as if" by
784 calling the members <tt>falsename()</tt> and
785 <tt>truename()</tt> of the facet obtained by
786 <tt>use_facet&lt;numpunct&lt;charT&gt;&nbsp;&gt;(str.getloc())</tt>.
787 Successive characters in the range <tt>[in,end)</tt> (see
788 [lib.sequence.reqmts]) are obtained and matched against
789 corresponding positions in the target sequences only as necessary to
790 identify a unique match. The input iterator <tt>in</tt> is
791 compared to <tt>end</tt> only when necessary to obtain a
792 character. If and only if a target sequence is uniquely matched,
793 <tt>val</tt> is set to the corresponding value.</p>
795 </blockquote>
797 <blockquote>
798 <p>The <tt>in</tt> iterator is always left pointing one position beyond the last character
799 successfully matched. If <tt>val</tt> is set, then err is set to <tt>str.goodbit</tt>; or to
800 <tt>str.eofbit</tt> if, when seeking another character to match, it is found that
801 <tt>(in==end)</tt>. If <tt>val</tt> is not set, then <i>err</i> is set to <tt>str.failbit</tt>; or to
802 <tt>(str.failbit|str.eofbit)</tt>if
803 the reason for the failure was that <tt>(in==end)</tt>. [Example: for targets
804 <tt>true</tt>:"a" and <tt>false</tt>:"abb", the input sequence "a" yields
805 <tt>val==true</tt> and <tt>err==str.eofbit</tt>; the input sequence "abc" yields
806 <tt>err=str.failbit</tt>, with <tt>in</tt> ending at the 'c' element. For targets
807 <tt>true</tt>:"1"
808 and <tt>false</tt>:"0", the input sequence "1" yields <tt>val==true</tt>
809 and <tt>err=str.goodbit</tt>. For empty targets (""), any input sequence yields
810 <tt>err==str.failbit</tt>. --end example]</p>
811 </blockquote>
812 <hr>
813 <a name="18"><h3>18.&nbsp;Get(...bool&amp;) omitted</h3></a><p><b>Section:</b>&nbsp;22.2.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.members"> [lib.facet.num.get.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
814 <p>In the list of num_get&lt;&gt; non-virtual members on page 22-23, the member
815 that parses bool values was omitted from the list of definitions of non-virtual
816 members, though it is listed in the class definition and the corresponding
817 virtual is listed everywhere appropriate. </p>
818 <p><b>Proposed resolution:</b></p>
819 <p>Add at the beginning of 22.2.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.members"> [lib.facet.num.get.members]</a>
820 another get member for bool&amp;, copied from the entry in
821 22.2.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.num.get"> [lib.locale.num.get]</a>.</p>
822 <hr>
823 <a name="19"><h3>19.&nbsp;"Noconv" definition too vague</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
825 In the definitions of codecvt&lt;&gt;::do_out and do_in, they are
826 specified to return noconv if "no conversion is
827 needed". This definition is too vague, and does not say
828 normatively what is done with the buffers.
829 </p>
830 <p><b>Proposed resolution:</b></p>
832 Change the entry for noconv in the table under paragraph 4 in section
833 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> to read:
834 </p>
835 <blockquote>
836 <p><tt>noconv</tt>: <tt>internT</tt> and <tt>externT</tt> are the same type,
837 and input sequence is identical to converted sequence.</p>
838 </blockquote>
839 <p>Change the Note in paragraph 2 to normative text as follows:</p>
840 <blockquote>
841 <p>If returns <tt>noconv</tt>, <tt>internT</tt> and <tt>externT</tt> are the
842 same type and the converted sequence is identical to the input sequence <tt>[from,from_next)</tt>.
843 <tt>to_next</tt> is set equal to <tt>to</tt>, the value of <tt>state</tt> is
844 unchanged, and there are no changes to the values in <tt>[to, to_limit)</tt>.</p>
845 </blockquote>
846 <hr>
847 <a name="20"><h3>20.&nbsp;Thousands_sep returns wrong type</h3></a><p><b>Section:</b>&nbsp;22.2.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.numpunct.virtuals"> [lib.facet.numpunct.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
848 <p>The synopsis for numpunct&lt;&gt;::do_thousands_sep, and the
849 definition of numpunct&lt;&gt;::thousands_sep which calls it, specify
850 that it returns a value of type char_type. Here it is erroneously
851 described as returning a "string_type". </p>
852 <p><b>Proposed resolution:</b></p>
853 <p>In 22.2.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.numpunct.virtuals"> [lib.facet.numpunct.virtuals]</a>, above paragraph 2, change
854 "string_type" to "char_type". </p>
855 <hr>
856 <a name="21"><h3>21.&nbsp;Codecvt_byname&lt;&gt; instantiations</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
857 <p>In the second table in the section, captioned "Required
858 instantiations", the instantiations for codecvt_byname&lt;&gt;
859 have been omitted. These are necessary to allow users to construct a
860 locale by name from facets. </p>
861 <p><b>Proposed resolution:</b></p>
862 <p>Add in 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> to the table captioned
863 "Required instantiations", in the category "ctype"
864 the lines </p>
866 <blockquote>
867 <pre>codecvt_byname&lt;char,char,mbstate_t&gt;,
868 codecvt_byname&lt;wchar_t,char,mbstate_t&gt; </pre>
869 </blockquote>
870 <hr>
871 <a name="22"><h3>22.&nbsp;Member open vs. flags</h3></a><p><b>Section:</b>&nbsp;27.8.1.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.members"> [lib.ifstream.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
872 <p>The description of basic_istream&lt;&gt;::open leaves unanswered questions about how it
873 responds to or changes flags in the error status for the stream. A strict reading
874 indicates that it ignores the bits and does not change them, which confuses users who do
875 not expect eofbit and failbit to remain set after a successful open. There are three
876 reasonable resolutions: 1) status quo 2) fail if fail(), ignore eofbit 3) clear failbit
877 and eofbit on call to open(). </p>
878 <p><b>Proposed resolution:</b></p>
879 <p>In 27.8.1.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.members"> [lib.ifstream.members]</a> paragraph 3, <i>and</i> in 27.8.1.10 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ofstream.members"> [lib.ofstream.members]</a> paragraph 3, under open() effects, add a footnote:
880 </p>
882 <blockquote>
883 <p>A successful open does not change the error state.</p>
884 </blockquote>
885 <p><b>Rationale:</b></p>
886 <p>This may seem surprising to some users, but it's just an instance
887 of a general rule: error flags are never cleared by the
888 implementation. The only way error flags are are ever cleared is if
889 the user explicitly clears them by hand.</p>
891 <p>The LWG believed that preserving this general rule was
892 important enough so that an exception shouldn't be made just for this
893 one case. The resolution of this issue clarifies what the LWG
894 believes to have been the original intent.</p>
896 <hr>
897 <a name="24"></a><h3><a name="24">24.&nbsp;"do_convert" doesn't exist</a></h3><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
898 <p>The description of codecvt&lt;&gt;::do_out and do_in mentions a
899 symbol "do_convert" which is not defined in the
900 standard. This is a leftover from an edit, and should be "do_in
901 and do_out". </p>
902 <p><b>Proposed resolution:</b></p>
903 <p>In 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>, paragraph 3, change
904 "do_convert" to "do_in or do_out". Also, in 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>, change "do_convert()" to "do_in
905 or do_out". </p>
906 <hr>
907 <a name="25"><h3>25.&nbsp;String operator&lt;&lt; uses width() value wrong</h3></a><p><b>Section:</b>&nbsp;21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
908 <p>In the description of operator&lt;&lt; applied to strings, the standard says that uses
909 the smaller of os.width() and str.size(), to pad "as described in stage 3"
910 elsewhere; but this is inconsistent, as this allows no possibility of space for padding. </p>
911 <p><b>Proposed resolution:</b></p>
912 <p>Change 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a> paragraph 4 from:<br>
913 <br>
914 &nbsp;&nbsp;&nbsp; "... where <tt>n</tt> is the smaller of <tt>os.width()</tt> and <tt>str.size()</tt>;
915 ..."<br>
916 <br>
917 to: <br>
918 <br>
919 &nbsp;&nbsp;&nbsp; "... where <tt>n</tt> is the larger of <tt>os.width()</tt> and <tt>str.size()</tt>;
920 ..."</p>
921 <hr>
922 <a name="26"><h3>26.&nbsp;Bad sentry example</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
923 <p>In paragraph 6, the code in the example: </p>
925 <pre> template &lt;class charT, class traits = char_traits&lt;charT&gt; &gt;
926 basic_istream&lt;charT,traits&gt;::sentry(
927 basic_istream&lt;charT,traits&gt;&amp; is, bool noskipws = false) {
929 int_type c;
930 typedef ctype&lt;charT&gt; ctype_type;
931 const ctype_type&amp; ctype = use_facet&lt;ctype_type&gt;(is.getloc());
932 while ((c = is.rdbuf()-&gt;snextc()) != traits::eof()) {
933 if (ctype.is(ctype.space,c)==0) {
934 is.rdbuf()-&gt;sputbackc (c);
935 break;
939 }</pre>
941 <p>fails to demonstrate correct use of the facilities described. In
942 particular, it fails to use traits operators, and specifies incorrect
943 semantics. (E.g. it specifies skipping over the first character in the
944 sequence without examining it.) </p>
945 <p><b>Proposed resolution:</b></p>
946 <p>Remove the example above from 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>
947 paragraph 6.</p>
948 <p><b>Rationale:</b></p>
949 <p>The originally proposed replacement code for the example was not
950 correct. The LWG tried in Kona and again in Tokyo to correct it
951 without success. In Tokyo, an implementor reported that actual working
952 code ran over one page in length and was quite complicated. The LWG
953 decided that it would be counter-productive to include such a lengthy
954 example, which might well still contain errors.</p>
955 <hr>
956 <a name="27"><h3>27.&nbsp;String::erase(range) yields wrong iterator</h3></a><p><b>Section:</b>&nbsp;21.3.5.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::erase"> [lib.string::erase]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
957 <p>The string::erase(iterator first, iterator last) is specified to return an element one
958 place beyond the next element after the last one erased. E.g. for the string
959 "abcde", erasing the range ['b'..'d') would yield an iterator for element 'e',
960 while 'd' has not been erased. </p>
961 <p><b>Proposed resolution:</b></p>
962 <p>In 21.3.5.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::erase"> [lib.string::erase]</a>, paragraph 10, change: </p>
964 <blockquote>
965 <p>Returns: an iterator which points to the element immediately following _last_ prior to
966 the element being erased. </p>
967 </blockquote>
969 <p>to read </p>
971 <blockquote>
972 <p>Returns: an iterator which points to the element pointed to by _last_ prior to the
973 other elements being erased. </p>
974 </blockquote>
975 <hr>
976 <a name="28"><h3>28.&nbsp;Ctype&lt;char&gt;is ambiguous</h3></a><p><b>Section:</b>&nbsp;22.2.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.char.members"> [lib.facet.ctype.char.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
977 <p>The description of the vector form of ctype&lt;char&gt;::is can be interpreted to mean
978 something very different from what was intended. Paragraph 4 says </p>
980 <blockquote>
981 <p>Effects: The second form, for all *p in the range [low, high), assigns vec[p-low] to
982 table()[(unsigned char)*p]. </p>
983 </blockquote>
985 <p>This is intended to copy the value indexed from table()[] into the place identified in
986 vec[]. </p>
987 <p><b>Proposed resolution:</b></p>
988 <p>Change 22.2.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.char.members"> [lib.facet.ctype.char.members]</a>, paragraph 4, to read </p>
990 <blockquote>
991 <p>Effects: The second form, for all *p in the range [low, high), assigns into vec[p-low]
992 the value table()[(unsigned char)*p]. </p>
993 </blockquote>
994 <hr>
995 <a name="29"><h3>29.&nbsp;Ios_base::init doesn't exist</h3></a><p><b>Section:</b>&nbsp;27.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.narrow.stream.objects"> [lib.narrow.stream.objects]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
996 <p>Sections 27.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.narrow.stream.objects"> [lib.narrow.stream.objects]</a> and 27.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.wide.stream.objects"> [lib.wide.stream.objects]</a> mention
997 a function ios_base::init, which is not defined. Probably they mean
998 basic_ios&lt;&gt;::init, defined in 27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a>,
999 paragraph 3. </p>
1000 <p><b>Proposed resolution:</b></p>
1001 <p>[R12: modified to include paragraph 5.]</p>
1003 <p>In 27.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.narrow.stream.objects"> [lib.narrow.stream.objects]</a> paragraph 2 and 5, change </p>
1005 <blockquote>
1006 <p>ios_base::init </p>
1007 </blockquote>
1009 <p>to </p>
1011 <blockquote>
1012 <p>basic_ios&lt;char&gt;::init </p>
1013 </blockquote>
1015 <p>Also, make a similar change in 27.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.wide.stream.objects"> [lib.wide.stream.objects]</a> except it
1016 should read </p>
1018 <blockquote>
1019 <p>basic_ios&lt;wchar_t&gt;::init </p>
1020 </blockquote>
1021 <hr>
1022 <a name="30"><h3>30.&nbsp;Wrong header for LC_*</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1023 <p>Paragraph 2 implies that the C macros LC_CTYPE etc. are defined in &lt;cctype&gt;,
1024 where they are in fact defined elsewhere to appear in &lt;clocale&gt;. </p>
1025 <p><b>Proposed resolution:</b></p>
1026 <p>In 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>, paragraph 2, change
1027 "&lt;cctype&gt;" to read "&lt;clocale&gt;". </p>
1028 <hr>
1029 <a name="31"><h3>31.&nbsp;Immutable locale values</h3></a><p><b>Section:</b>&nbsp;22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1030 <p>Paragraph 6, says "An instance of <tt>locale</tt> is
1031 <i>immutable</i>; once a facet reference is obtained from it,
1032 ...". This has caused some confusion, because locale variables
1033 are manifestly assignable. </p>
1034 <p><b>Proposed resolution:</b></p>
1035 <p>In 22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a> replace paragraph 6</p>
1037 <blockquote>
1038 <p>An instance of <tt>locale</tt> is immutable; once a facet
1039 reference is obtained from it, that reference remains usable as long
1040 as the locale value itself exists.</p>
1041 </blockquote>
1043 <p>with</p>
1045 <blockquote>
1046 <p>Once a facet reference is obtained from a locale object by
1047 calling use_facet&lt;&gt;, that reference remains usable, and the
1048 results from member functions of it may be cached and re-used, as
1049 long as some locale object refers to that facet.</p>
1050 </blockquote>
1051 <hr>
1052 <a name="32"><h3>32.&nbsp;Pbackfail description inconsistent</h3></a><p><b>Section:</b>&nbsp;27.5.2.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.pback"> [lib.streambuf.virt.pback]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1053 <p>The description of the required state before calling virtual member
1054 basic_streambuf&lt;&gt;::pbackfail requirements is inconsistent with the conditions
1055 described in 27.5.2.2.4 [lib.streambuf.pub.pback] where member sputbackc calls it.
1056 Specifically, the latter says it calls pbackfail if: </p>
1058 <p>&nbsp;&nbsp;&nbsp; traits::eq(c,gptr()[-1]) is false </p>
1060 <p>where pbackfail claims to require: </p>
1062 <p>&nbsp;&nbsp;&nbsp; traits::eq(*gptr(),traits::to_char_type(c)) returns false </p>
1064 <p>It appears that the pbackfail description is wrong. </p>
1065 <p><b>Proposed resolution:</b></p>
1066 <p>In 27.5.2.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.pback"> [lib.streambuf.virt.pback]</a>, paragraph 1, change:</p>
1068 <blockquote>
1069 <p>"<tt>traits::eq(*gptr(),traits::to_char_type( c))</tt>"</p>
1070 </blockquote>
1072 <p>to </p>
1074 <blockquote>
1075 <p>"<tt>traits::eq(traits::to_char_type(c),gptr()[-1])</tt>"
1076 </p>
1077 </blockquote>
1078 <p><b>Rationale:</b></p>
1079 <p>Note deliberate reordering of arguments for clarity in addition to the correction of
1080 the argument value.</p>
1081 <hr>
1082 <a name="33"><h3>33.&nbsp;Codecvt&lt;&gt; mentions from_type</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1083 <p>In the table defining the results from do_out and do_in, the specification for the
1084 result <i>error</i> says </p>
1086 <blockquote>
1087 <p>encountered a from_type character it could not convert </p>
1088 </blockquote>
1090 <p>but from_type is not defined. This clearly is intended to be an externT for do_in, or
1091 an internT for do_out. </p>
1092 <p><b>Proposed resolution:</b></p>
1093 <p>In 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> paragraph 4, replace the definition
1094 in the table for the case of _error_ with </p>
1096 <blockquote>
1097 <p>encountered a character in <tt>[from,from_end)</tt> that it could not convert. </p>
1098 </blockquote>
1099 <hr>
1100 <a name="34"><h3>34.&nbsp;True/falsename() not in ctype&lt;&gt;</h3></a><p><b>Section:</b>&nbsp;22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1101 <p>In paragraph 19, Effects:, members truename() and falsename are used from facet
1102 ctype&lt;charT&gt;, but it has no such members. Note that this is also a problem in
1103 22.2.2.1.2, addressed in (4). </p>
1104 <p><b>Proposed resolution:</b></p>
1105 <p>In 22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>, paragraph 19, in the Effects:
1106 clause for member put(...., bool), replace the initialization of the
1107 string_type value s as follows: </p>
1109 <blockquote>
1110 <pre>const numpunct&amp; np = use_facet&lt;numpunct&lt;charT&gt; &gt;(loc);
1111 string_type s = val ? np.truename() : np.falsename(); </pre>
1112 </blockquote>
1113 <hr>
1114 <a name="35"><h3>35.&nbsp;No manipulator unitbuf in synopsis</h3></a><p><b>Section:</b>&nbsp;27.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostreams.base"> [lib.iostreams.base]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1115 <p>In 27.4.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fmtflags.manip"> [lib.fmtflags.manip]</a>, we have a definition for a manipulator
1116 named "unitbuf". Unlike other manipulators, it's not listed
1117 in synopsis. Similarly for "nounitbuf". </p>
1118 <p><b>Proposed resolution:</b></p>
1119 <p>Add to the synopsis for &lt;ios&gt; in 27.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostreams.base"> [lib.iostreams.base]</a>, after
1120 the entry for "nouppercase", the prototypes: </p>
1122 <blockquote>
1123 <pre>ios_base&amp; unitbuf(ios_base&amp; str);
1124 ios_base&amp; nounitbuf(ios_base&amp; str); </pre>
1125 </blockquote>
1126 <hr>
1127 <a name="36"><h3>36.&nbsp;Iword &amp; pword storage lifetime omitted</h3></a><p><b>Section:</b>&nbsp;27.4.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.storage"> [lib.ios.base.storage]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1128 <p>In the definitions for ios_base::iword and pword, the lifetime of the storage is
1129 specified badly, so that an implementation which only keeps the last value stored appears
1130 to conform. In particular, it says: </p>
1132 <p>The reference returned may become invalid after another call to the object's iword
1133 member with a different index ... </p>
1135 <p>This is not idle speculation; at least one implementation was done this way. </p>
1136 <p><b>Proposed resolution:</b></p>
1137 <p>Add in 27.4.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.storage"> [lib.ios.base.storage]</a>, in both paragraph 2 and also in
1138 paragraph 4, replace the sentence: </p>
1140 <blockquote>
1141 <p>The reference returned may become invalid after another call to the object's iword
1142 [pword] member with a different index, after a call to its copyfmt member, or when the
1143 object is destroyed. </p>
1144 </blockquote>
1146 <p>with: </p>
1148 <blockquote>
1149 <p>The reference returned is invalid after any other operations on the object. However,
1150 the value of the storage referred to is retained, so that until the next call to copyfmt,
1151 calling iword [pword] with the same index yields another reference to the same value. </p>
1152 </blockquote>
1154 <p>substituting "iword" or "pword" as appropriate. </p>
1155 <hr>
1156 <a name="37"><h3>37.&nbsp;Leftover "global" reference</h3></a><p><b>Section:</b>&nbsp;22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1157 <p>In the overview of locale semantics, paragraph 4, is the sentence </p>
1159 <blockquote>
1160 <p>If Facet is not present in a locale (or, failing that, in the global locale), it throws
1161 the standard exception bad_cast. </p>
1162 </blockquote>
1164 <p>This is not supported by the definition of use_facet&lt;&gt;, and represents semantics
1165 from an old draft. </p>
1166 <p><b>Proposed resolution:</b></p>
1167 <p>In 22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>, paragraph 4, delete the parenthesized
1168 expression </p>
1170 <blockquote>
1171 <p>(or, failing that, in the global locale) </p>
1172 </blockquote>
1173 <hr>
1174 <a name="38"><h3>38.&nbsp;Facet definition incomplete</h3></a><p><b>Section:</b>&nbsp;22.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.global.templates"> [lib.locale.global.templates]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1175 <p>It has been noticed by Esa Pulkkinen that the definition of
1176 "facet" is incomplete. In particular, a class derived from
1177 another facet, but which does not define a member <i>id</i>, cannot
1178 safely serve as the argument <i>F</i> to use_facet&lt;F&gt;(loc),
1179 because there is no guarantee that a reference to the facet instance
1180 stored in <i>loc</i> is safely convertible to <i>F</i>. </p>
1181 <p><b>Proposed resolution:</b></p>
1182 <p>In the definition of std::use_facet&lt;&gt;(), replace the text in paragraph 1 which
1183 reads: </p>
1185 <blockquote>
1186 <p>Get a reference to a facet of a locale. </p>
1187 </blockquote>
1189 <p>with: </p>
1191 <blockquote>
1192 <p>Requires: <tt>Facet</tt> is a facet class whose definition
1193 contains the public static member <tt>id</tt> as defined in 22.1.1.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.facet"> [lib.locale.facet]</a>. </p>
1194 </blockquote>
1196 <p><i>[
1197 Kona: strike as overspecification the text "(not inherits)"
1198 from the original resolution, which read "... whose definition
1199 contains (not inherits) the public static member
1200 <tt>id</tt>..."
1201 ]</i></p>
1203 <hr>
1204 <a name="39"><h3>39.&nbsp;istreambuf_iterator&lt;&gt;::operator++(int) definition garbled</h3></a><p><b>Section:</b>&nbsp;24.5.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator::op++"> [lib.istreambuf.iterator::op++]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1205 <p>Following the definition of istreambuf_iterator&lt;&gt;::operator++(int) in paragraph
1206 3, the standard contains three lines of garbage text left over from a previous edit. </p>
1208 <blockquote>
1209 <pre>istreambuf_iterator&lt;charT,traits&gt; tmp = *this;
1210 sbuf_-&gt;sbumpc();
1211 return(tmp); </pre>
1212 </blockquote>
1213 <p><b>Proposed resolution:</b></p>
1214 <p>In 24.5.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator::op++"> [lib.istreambuf.iterator::op++]</a>, delete the three lines of code at the
1215 end of paragraph 3. </p>
1216 <hr>
1217 <a name="40"><h3>40.&nbsp;Meaningless normative paragraph in examples</h3></a><p><b>Section:</b>&nbsp;22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1218 <p>Paragraph 3 of the locale examples is a description of part of an
1219 implementation technique that has lost its referent, and doesn't mean
1220 anything. </p>
1221 <p><b>Proposed resolution:</b></p>
1222 <p>Delete 22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a> paragraph 3 which begins "This
1223 initialization/identification system depends...", or (at the
1224 editor's option) replace it with a place-holder to keep the paragraph
1225 numbering the same. </p>
1226 <hr>
1227 <a name="41"><h3>41.&nbsp;Ios_base needs clear(), exceptions()</h3></a><p><b>Section:</b>&nbsp;27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1228 <p>The description of ios_base::iword() and pword() in 27.4.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.members.static"> [lib.ios.members.static]</a>, say that if they fail, they "set badbit,
1229 which may throw an exception". However, ios_base offers no
1230 interface to set or to test badbit; those interfaces are defined in
1231 basic_ios&lt;&gt;. </p>
1232 <p><b>Proposed resolution:</b></p>
1233 <p>Change the description in 27.4.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.storage"> [lib.ios.base.storage]</a> in
1234 paragraph 2, and also in paragraph 4, as follows. Replace</p>
1236 <blockquote>
1237 <p>If the function fails it sets badbit, which may throw an exception.</p>
1238 </blockquote>
1240 <p>with</p>
1242 <blockquote>
1243 <p>If the function fails, and <tt>*this</tt> is a base sub-object of
1244 a <tt>basic_ios&lt;&gt;</tt> object or sub-object, the effect is
1245 equivalent to calling <tt>basic_ios&lt;&gt;::setstate(badbit)</tt>
1246 on the derived object (which may throw <tt>failure</tt>).</p>
1247 </blockquote>
1249 <p><i>[Kona: LWG reviewed wording; setstate(failbit) changed to
1250 setstate(badbit).]</i></p>
1252 <hr>
1253 <a name="42"><h3>42.&nbsp;String ctors specify wrong default allocator</h3></a><p><b>Section:</b>&nbsp;21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1254 <p>The basic_string&lt;&gt; copy constructor: </p>
1256 <pre>basic_string(const basic_string&amp; str, size_type pos = 0,
1257 size_type n = npos, const Allocator&amp; a = Allocator()); </pre>
1259 <p>specifies an Allocator argument default value that is
1260 counter-intuitive. The natural choice for a the allocator to copy from
1261 is str.get_allocator(). Though this cannot be expressed in
1262 default-argument notation, overloading suffices. </p>
1264 <p>Alternatively, the other containers in Clause 23 (deque, list,
1265 vector) do not have this form of constructor, so it is inconsistent,
1266 and an evident source of confusion, for basic_string&lt;&gt; to have
1267 it, so it might better be removed. </p>
1268 <p><b>Proposed resolution:</b></p>
1269 <p> In 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>, replace the declaration of the copy
1270 constructor as follows: </p>
1272 <blockquote>
1273 <pre>basic_string(const basic_string&amp; str);
1274 basic_string(const basic_string&amp; str, size_type pos, size_type n = npos,
1275 const Allocator&amp; a = Allocator());</pre>
1276 </blockquote>
1278 <p>In 21.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a>, replace the copy constructor declaration
1279 as above. Add to paragraph 5, Effects:</p>
1281 <blockquote>
1282 <p>In the first form, the Allocator value used is copied from
1283 <tt>str.get_allocator()</tt>.</p>
1284 </blockquote>
1285 <p><b>Rationale:</b></p>
1286 <p>The LWG believes the constructor is actually broken, rather than
1287 just an unfortunate design choice.</p>
1289 <p>The LWG considered two other possible resolutions:</p>
1291 <p>A. In 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>, replace the declaration of the copy
1292 constructor as follows:</p>
1294 <blockquote>
1295 <pre>basic_string(const basic_string&amp; str, size_type pos = 0,
1296 size_type n = npos);
1297 basic_string(const basic_string&amp; str, size_type pos,
1298 size_type n, const Allocator&amp; a); </pre>
1299 </blockquote>
1301 <p>In 21.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a>, replace the copy constructor declaration
1302 as above. Add to paragraph 5, Effects: </p>
1304 <blockquote>
1305 <p>When no <tt>Allocator</tt> argument is provided, the string is constructed using the
1306 value <tt>str.get_allocator()</tt>. </p>
1307 </blockquote>
1309 <p>B. In 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>, and also in 21.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a>, replace
1310 the declaration of the copy constructor as follows: </p>
1312 <blockquote>
1313 <pre>basic_string(const basic_string&amp; str, size_type pos = 0,
1314 size_type n = npos); </pre>
1315 </blockquote>
1317 <p>The proposed resolution reflects the original intent of the LWG. It
1318 was also noted by Pete Becker that this fix "will cause
1319 a small amount of existing code to now work correctly."</p>
1321 <p><i>[
1322 Kona: issue editing snafu fixed - the proposed resolution now correctly
1323 reflects the LWG consensus.
1324 ]</i></p>
1325 <hr>
1326 <a name="44"><h3>44.&nbsp;Iostreams use operator== on int_type values</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
1327 <p>Many of the specifications for iostreams specify that character
1328 values or their int_type equivalents are compared using operators ==
1329 or !=, though in other places traits::eq() or traits::eq_int_type is
1330 specified to be used throughout. This is an inconsistency; we should
1331 change uses of == and != to use the traits members instead. </p>
1332 <p><b>Proposed resolution:</b></p>
1334 <p><i>[Pre-Kona: Dietmar supplied wording]</i></p>
1336 <p>List of changes to clause 27:</p>
1337 <ol>
1338 <li>
1339 In lib.basic.ios.members paragraph 13 (postcondition clause for
1340 'fill(cT)') change
1342 <blockquote>
1343 fillch == fill()
1344 </blockquote>
1348 <blockquote>
1349 traits::eq(fillch, fill())
1350 </blockquote>
1353 </li>
1354 <li>
1355 In lib.istream.unformatted paragraph 7 (effects clause for
1356 'get(cT,streamsize,cT)'), third bullet, change
1358 <blockquote>
1359 c == delim for the next available input character c
1360 </blockquote>
1364 <blockquote>
1365 traits::eq(c, delim) for the next available input character c
1366 </blockquote>
1368 </li>
1369 <li>
1370 In lib.istream.unformatted paragraph 12 (effects clause for
1371 'get(basic_streambuf&lt;cT,Tr&gt;&amp;,cT)'), third bullet, change
1373 <blockquote>
1374 c == delim for the next available input character c
1375 </blockquote>
1379 <blockquote>
1380 traits::eq(c, delim) for the next available input character c
1381 </blockquote>
1383 </li>
1384 <li>
1385 In lib.istream.unformatted paragraph 17 (effects clause for
1386 'getline(cT,streamsize,cT)'), second bullet, change
1388 <blockquote>
1389 c == delim for the next available input character c
1390 </blockquote>
1394 <blockquote>
1395 traits::eq(c, delim) for the next available input character c
1396 </blockquote>
1398 </li>
1399 <li>
1400 In lib.istream.unformatted paragraph 24 (effects clause for
1401 'ignore(int,int_type)'), second bullet, change
1403 <blockquote>
1404 c == delim for the next available input character c
1405 </blockquote>
1409 <blockquote>
1410 traits::eq_int_type(c, delim) for the next available input
1411 character c
1412 </blockquote>
1414 </li>
1415 <li>
1416 In lib.istream.unformatted paragraph 25 (notes clause for
1417 'ignore(int,int_type)'), second bullet, change
1419 <blockquote>
1420 The last condition will never occur if delim == traits::eof()
1421 </blockquote>
1425 <blockquote>
1426 The last condition will never occur if
1427 traits::eq_int_type(delim, traits::eof()).
1428 </blockquote>
1430 </li>
1431 <li>
1432 In lib.istream.sentry paragraph 6 (example implementation for the
1433 sentry constructor) change
1435 <blockquote>
1436 while ((c = is.rdbuf()-&gt;snextc()) != traits::eof()) {
1437 </blockquote>
1441 <blockquote>
1442 while (!traits::eq_int_type(c = is.rdbuf()-&gt;snextc(), traits::eof())) {
1443 </blockquote>
1445 </li>
1446 </ol>
1448 <p>List of changes to Chapter 21:</p>
1450 <ol>
1451 <li>
1452 In lib.string::find paragraph 1 (effects clause for find()),
1453 second bullet, change
1455 <blockquote>
1456 at(xpos+I) == str.at(I) for all elements ...
1457 </blockquote>
1461 <blockquote>
1462 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1463 </blockquote>
1465 </li>
1466 <li>
1467 In lib.string::rfind paragraph 1 (effects clause for rfind()),
1468 second bullet, change
1470 <blockquote>
1471 at(xpos+I) == str.at(I) for all elements ...
1472 </blockquote>
1476 <blockquote>
1477 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1478 </blockquote>
1480 </li>
1481 <li>
1482 In lib.string::find.first.of paragraph 1 (effects clause for
1483 find_first_of()), second bullet, change
1485 <blockquote>
1486 at(xpos+I) == str.at(I) for all elements ...
1487 </blockquote>
1491 <blockquote>
1492 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1493 </blockquote>
1495 </li>
1496 <li>
1497 In lib.string::find.last.of paragraph 1 (effects clause for
1498 find_last_of()), second bullet, change
1500 <blockquote>
1501 at(xpos+I) == str.at(I) for all elements ...
1502 </blockquote>
1506 <blockquote>
1507 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1508 </blockquote>
1510 </li>
1511 <li>
1512 In lib.string::find.first.not.of paragraph 1 (effects clause for
1513 find_first_not_of()), second bullet, change
1515 <blockquote>
1516 at(xpos+I) == str.at(I) for all elements ...
1517 </blockquote>
1521 <blockquote>
1522 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1523 </blockquote>
1524 </li>
1526 <li>
1527 In lib.string::find.last.not.of paragraph 1 (effects clause for
1528 find_last_not_of()), second bullet, change
1530 <blockquote>
1531 at(xpos+I) == str.at(I) for all elements ...
1532 </blockquote>
1536 <blockquote>
1537 traits::eq(at(xpos+I), str.at(I)) for all elements ...
1538 </blockquote>
1539 </li>
1541 <li>
1542 In lib.string.ios paragraph 5 (effects clause for getline()),
1543 second bullet, change
1545 <blockquote>
1546 c == delim for the next available input character c
1547 </blockquote>
1551 <blockquote>
1552 traits::eq(c, delim) for the next available input character c
1553 </blockquote>
1554 </li>
1556 </ol>
1558 <p>Notes:</p>
1559 <ul>
1560 <li>
1561 Fixing this issue highlights another sloppyness in
1562 lib.istream.unformatted paragraph 24: this clause mentions a "character"
1563 which is then compared to an 'int_type' (see item 5. in the list
1564 below). It is not clear whether this requires explicit words and
1565 if so what these words are supposed to be. A similar issue exists,
1566 BTW, for operator*() of istreambuf_iterator which returns the result
1567 of sgetc() as a character type (see lib.istreambuf.iterator::op*
1568 paragraph 1), and for operator++() of istreambuf_iterator which
1569 passes the result of sbumpc() to a constructor taking a char_type
1570 (see lib.istreambuf.iterator::operator++ paragraph 3). Similarily, the
1571 assignment operator ostreambuf_iterator passes a char_type to a function
1572 taking an int_type (see lib.ostreambuf.iter.ops paragraph 1).
1573 </li>
1574 <li>
1575 It is inconsistent to use comparisons using the traits functions in
1576 Chapter 27 while not using them in Chapter 21, especially as some
1577 of the inconsistent uses actually involve streams (eg. getline() on
1578 streams). To avoid leaving this issue open still longer due to this
1579 inconsistency (it is open since 1998), a list of changes to Chapter
1580 21 is below.
1581 </li>
1582 <li>
1583 In Chapter 24 there are several places with statements like "the end
1584 of stream is reached (streambuf_type::sgetc() returns traits::eof())"
1585 (lib.istreambuf.iterator paragraph 1, lib.ostreambuf.iter.ops
1586 paragraph 5). It is unclear whether these should be clarified to use
1587 traits::eq_int_type() for detecting traits::eof().
1588 </li>
1589 </ul>
1591 <hr>
1592 <a name="46"><h3>46.&nbsp;Minor Annex D errors</h3></a><p><b>Section:</b>&nbsp;D.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.str.strstreams"> [depr.str.strstreams]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Brendan Kehoe&nbsp; <b>Date:</b>&nbsp; 1 Jun 1998</p>
1593 <p>See lib-6522 and edit-814.</p>
1594 <p><b>Proposed resolution:</b></p>
1595 <p>Change D.7.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf"> [depr.strstreambuf]</a> (since streambuf is a typedef of
1596 basic_streambuf&lt;char&gt;) from:</p>
1598 <pre> virtual streambuf&lt;char&gt;* setbuf(char* s, streamsize n);</pre>
1600 <p>to:</p>
1602 <pre> virtual streambuf* setbuf(char* s, streamsize n);</pre>
1604 <p>In D.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstream"> [depr.strstream]</a> insert the semicolon now missing after
1605 int_type:</p>
1607 <pre> namespace std {
1608 class strstream
1609 : public basic_iostream&lt;char&gt; {
1610 public:
1611 // Types
1612 typedef char char_type;
1613 typedef typename char_traits&lt;char&gt;::int_type int_type
1614 typedef typename char_traits&lt;char&gt;::pos_type pos_type;</pre>
1615 <hr>
1616 <a name="47"><h3>47.&nbsp;Imbue() and getloc() Returns clauses swapped</h3></a><p><b>Section:</b>&nbsp;27.4.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.locales"> [lib.ios.base.locales]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;21 Jun 1998</p>
1617 <p>Section 27.4.2.3 specifies how imbue() and getloc() work. That
1618 section has two RETURNS clauses, and they make no sense as
1619 stated. They make perfect sense, though, if you swap them. Am I
1620 correct in thinking that paragraphs 2 and 4 just got mixed up by
1621 accident?</p>
1622 <p><b>Proposed resolution:</b></p>
1623 <p>In 27.4.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.locales"> [lib.ios.base.locales]</a> swap paragraphs 2 and 4.</p>
1624 <hr>
1625 <a name="48"><h3>48.&nbsp;Use of non-existent exception constructor</h3></a><p><b>Section:</b>&nbsp;27.4.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios::failure"> [lib.ios::failure]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;21 Jun 1998</p>
1626 <p>27.4.2.1.1, paragraph 2, says that class failure initializes the
1627 base class, exception, with exception(msg). Class exception (see
1628 18.6.1) has no such constructor.</p>
1629 <p><b>Proposed resolution:</b></p>
1630 <p>Replace 27.4.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios::failure"> [lib.ios::failure]</a>, paragraph 2, with</p>
1632 <blockquote>
1633 <p>EFFECTS: Constructs an object of class <tt>failure</tt>.</p>
1634 </blockquote>
1635 <hr>
1636 <a name="49"><h3>49.&nbsp;Underspecification of ios_base::sync_with_stdio</h3></a><p><b>Section:</b>&nbsp;27.4.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.members.static"> [lib.ios.members.static]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;21 Jun 1998</p>
1637 <p>Two problems</p>
1639 <p>(1) 27.4.2.4 doesn't say what ios_base::sync_with_stdio(f)
1640 returns. Does it return f, or does it return the previous
1641 synchronization state? My guess is the latter, but the standard
1642 doesn't say so.</p>
1644 <p>(2) 27.4.2.4 doesn't say what it means for streams to be
1645 synchronized with stdio. Again, of course, I can make some
1646 guesses. (And I'm unhappy about the performance implications of those
1647 guesses, but that's another matter.)</p>
1648 <p><b>Proposed resolution:</b></p>
1649 <p>Change the following sentence in 27.4.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.members.static"> [lib.ios.members.static]</a>
1650 returns clause from:</p>
1652 <blockquote>
1653 <p><tt>true</tt> if the standard iostream objects (27.3) are
1654 synchronized and otherwise returns <tt>false</tt>.</p>
1655 </blockquote>
1657 <p>to:</p>
1659 <blockquote>
1660 <p><tt>true</tt> if the previous state of the standard iostream
1661 objects (27.3) was synchronized and otherwise returns
1662 <tt>false</tt>.</p>
1663 </blockquote>
1665 <p>Add the following immediately after 27.4.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.members.static"> [lib.ios.members.static]</a>,
1666 paragraph 2:</p>
1668 <blockquote>
1669 <p>When a standard iostream object str is <i>synchronized</i> with a
1670 standard stdio stream f, the effect of inserting a character c by</p>
1671 <pre> fputc(f, c);
1672 </pre>
1674 <p>is the same as the effect of</p>
1675 <pre> str.rdbuf()-&gt;sputc(c);
1676 </pre>
1678 <p>for any sequence of characters; the effect of extracting a
1679 character c by</p>
1680 <pre> c = fgetc(f);
1681 </pre>
1683 <p>is the same as the effect of:</p>
1684 <pre> c = str.rdbuf()-&gt;sbumpc(c);
1685 </pre>
1687 <p>for any sequences of characters; and the effect of pushing
1688 back a character c by</p>
1689 <pre> ungetc(c, f);
1690 </pre>
1692 <p>is the same as the effect of</p>
1693 <pre> str.rdbuf()-&gt;sputbackc(c);
1694 </pre>
1696 <p>for any sequence of characters. [<i>Footnote</i>: This implies
1697 that operations on a standard iostream object can be mixed arbitrarily
1698 with operations on the corresponding stdio stream. In practical
1699 terms, synchronization usually means that a standard iostream object
1700 and a standard stdio object share a buffer. <i>--End Footnote</i>]</p>
1701 </blockquote>
1703 <p><i>[pre-Copenhagen: PJP and Matt contributed the definition
1704 of "synchronization"]</i></p>
1706 <p><i>[post-Copenhagen: proposed resolution was revised slightly:
1707 text was added in the non-normative footnote to say that operations
1708 on the two streams can be mixed arbitrarily.]</i></p>
1709 <hr>
1710 <a name="50"><h3>50.&nbsp;Copy constructor and assignment operator of ios_base</h3></a><p><b>Section:</b>&nbsp;27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;21 Jun 1998</p>
1711 <p>As written, ios_base has a copy constructor and an assignment
1712 operator. (Nothing in the standard says it doesn't have one, and all
1713 classes have copy constructors and assignment operators unless you
1714 take specific steps to avoid them.) However, nothing in 27.4.2 says
1715 what the copy constructor and assignment operator do. </p>
1717 <p>My guess is that this was an oversight, that ios_base is, like
1718 basic_ios, not supposed to have a copy constructor or an assignment
1719 operator.</p>
1722 Jerry Schwarz comments: Yes, its an oversight, but in the opposite
1723 sense to what you're suggesting. At one point there was a definite
1724 intention that you could copy ios_base. It's an easy way to save the
1725 entire state of a stream for future use. As you note, to carry out
1726 that intention would have required a explicit description of the
1727 semantics (e.g. what happens to the iarray and parray stuff).
1728 </p>
1729 <p><b>Proposed resolution:</b></p>
1730 <p>In 27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a>, class ios_base, specify the copy
1731 constructor and operator= members as being private.</p>
1732 <p><b>Rationale:</b></p>
1733 <p>The LWG believes the difficulty of specifying correct semantics
1734 outweighs any benefit of allowing ios_base objects to be copyable.</p>
1735 <hr>
1736 <a name="51"><h3>51.&nbsp;Requirement to not invalidate iterators missing</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;David Vandevoorde&nbsp; <b>Date:</b>&nbsp;23 Jun 1998</p>
1737 <p>The std::sort algorithm can in general only sort a given sequence
1738 by moving around values. The list&lt;&gt;::sort() member on the other
1739 hand could move around values or just update internal pointers. Either
1740 method can leave iterators into the list&lt;&gt; dereferencable, but
1741 they would point to different things. </p>
1743 <p>Does the FDIS mandate anywhere which method should be used for
1744 list&lt;&gt;::sort()?</p>
1746 <p>Matt Austern comments:</p>
1748 <p>I think you've found an omission in the standard. </p>
1750 <p>The library working group discussed this point, and there was
1751 supposed to be a general requirement saying that list, set, map,
1752 multiset, and multimap may not invalidate iterators, or change the
1753 values that iterators point to, except when an operation does it
1754 explicitly. So, for example, insert() doesn't invalidate any iterators
1755 and erase() and remove() only invalidate iterators pointing to the
1756 elements that are being erased. </p>
1758 <p>I looked for that general requirement in the FDIS, and, while I
1759 found a limited form of it for the sorted associative containers, I
1760 didn't find it for list. It looks like it just got omitted. </p>
1762 <p>The intention, though, is that list&lt;&gt;::sort does not
1763 invalidate any iterators and does not change the values that any
1764 iterator points to. There would be no reason to have the member
1765 function otherwise.</p>
1766 <p><b>Proposed resolution:</b></p>
1767 <p>Add a new paragraph at the end of 23.1:</p>
1769 <blockquote>
1770 <p>Unless otherwise specified (either explicitly or by defining a function in terms of
1771 other functions), invoking a container member function or passing a container as an
1772 argument to a library function shall not invalidate iterators to, or change the values of,
1773 objects within that container. </p>
1774 </blockquote>
1775 <p><b>Rationale:</b></p>
1776 <p>This was US issue CD2-23-011; it was accepted in London but the
1777 change was not made due to an editing oversight. The wording in the
1778 proposed resolution below is somewhat updated from CD2-23-011,
1779 particularly the addition of the phrase "or change the values
1780 of"</p>
1781 <hr>
1782 <a name="52"><h3>52.&nbsp;Small I/O problems</h3></a><p><b>Section:</b>&nbsp;27.4.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos.operations"> [lib.fpos.operations]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;23 Jun 1998</p>
1783 <p>First, 27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a>, table 89. This is pretty obvious:
1784 it should be titled "basic_ios&lt;&gt;() effects", not
1785 "ios_base() effects". </p>
1787 <p>[The second item is a duplicate; see issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#6">6</a> for
1788 resolution.]</p>
1790 <p>Second, 27.4.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos.operations"> [lib.fpos.operations]</a> table 88 . There are a couple
1791 different things wrong with it, some of which I've already discussed
1792 with Jerry, but the most obvious mechanical sort of error is that it
1793 uses expressions like P(i) and p(i), without ever defining what sort
1794 of thing "i" is.
1795 </p>
1797 <p>(The other problem is that it requires support for streampos
1798 arithmetic. This is impossible on some systems, i.e. ones where file
1799 position is a complicated structure rather than just a number. Jerry
1800 tells me that the intention was to require syntactic support for
1801 streampos arithmetic, but that it wasn't actually supposed to do
1802 anything meaningful except on platforms, like Unix, where genuine
1803 arithmetic is possible.) </p>
1804 <p><b>Proposed resolution:</b></p>
1805 <p>Change 27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a> table 89 title from
1806 "ios_base() effects" to "basic_ios&lt;&gt;()
1807 effects". </p>
1808 <hr>
1809 <a name="53"><h3>53.&nbsp;Basic_ios destructor unspecified</h3></a><p><b>Section:</b>&nbsp;27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;23 Jun 1998</p>
1810 <p>There's nothing in 27.4.4 saying what basic_ios's destructor does.
1811 The important question is whether basic_ios::~basic_ios() destroys
1812 rdbuf().</p>
1813 <p><b>Proposed resolution:</b></p>
1814 <p>Add after 27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a> paragraph 2:</p>
1816 <blockquote>
1817 <p><tt>virtual ~basic_ios();</tt></p>
1818 <p><b>Notes</b>: The destructor does not destroy <tt>rdbuf()</tt>.</p>
1819 </blockquote>
1820 <p><b>Rationale:</b></p>
1821 <p>The LWG reviewed the additional question of whether or not
1822 <tt>rdbuf(0)</tt> may set <tt>badbit</tt>. The answer is
1823 clearly yes; it may be set via <tt>clear()</tt>. See 27.4.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.members"> [lib.basic.ios.members]</a>, paragraph 6. This issue was reviewed at length
1824 by the LWG, which removed from the original proposed resolution a
1825 footnote which incorrectly said "<tt>rdbuf(0)</tt> does not set
1826 <tt>badbit</tt>".</p>
1827 <hr>
1828 <a name="54"><h3>54.&nbsp;Basic_streambuf's destructor</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;25 Jun 1998</p>
1829 <p>The class synopsis for basic_streambuf shows a (virtual)
1830 destructor, but the standard doesn't say what that destructor does. My
1831 assumption is that it does nothing, but the standard should say so
1832 explicitly. </p>
1833 <p><b>Proposed resolution:</b></p>
1834 <p>Add after 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> paragraph 2:</p>
1836 <blockquote>
1837 <p><tt>virtual&nbsp; ~basic_streambuf();</tt></p>
1838 <p><b>Effects</b>: None.</p>
1839 </blockquote>
1840 <hr>
1841 <a name="55"><h3>55.&nbsp;Invalid stream position is undefined</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;26 Jun 1998</p>
1842 <p>Several member functions in clause 27 are defined in certain
1843 circumstances to return an "invalid stream position", a term
1844 that is defined nowhere in the standard. Two places (27.5.2.4.2,
1845 paragraph 4, and 27.8.1.4, paragraph 15) contain a cross-reference to
1846 a definition in _lib.iostreams.definitions_, a nonexistent
1847 section. </p>
1849 <p>I suspect that the invalid stream position is just supposed to be
1850 pos_type(-1). Probably best to say explicitly in (for example)
1851 27.5.2.4.2 that the return value is pos_type(-1), rather than to use
1852 the term "invalid stream position", define that term
1853 somewhere, and then put in a cross-reference. </p>
1855 <p>The phrase "invalid stream position" appears ten times in
1856 the C++ Standard. In seven places it refers to a return value, and it
1857 should be changed. In three places it refers to an argument, and it
1858 should not be changed. Here are the three places where "invalid
1859 stream position" should not be changed:</p>
1861 <blockquote>
1862 <p>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>, paragraph 14<br>
1863 27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>, paragraph 14<br>
1864 D.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf.virtuals"> [depr.strstreambuf.virtuals]</a>, paragraph 17
1865 </p>
1866 </blockquote>
1867 <p><b>Proposed resolution:</b></p>
1868 <p>In 27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a>, paragraph 4, change "Returns an
1869 object of class pos_type that stores an invalid stream position
1870 (_lib.iostreams.definitions_)" to "Returns
1871 <tt>pos_type(off_type(-1))</tt>".
1872 </p>
1874 <p>In 27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a>, paragraph 6, change "Returns
1875 an object of class pos_type that stores an invalid stream
1876 position" to "Returns <tt>pos_type(off_type(-1))</tt>".</p>
1878 <p>In 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>, paragraph 13, change "the object
1879 stores an invalid stream position" to "the return value is
1880 <tt>pos_type(off_type(-1))</tt>". </p>
1882 <p>In 27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>, paragraph 13, change "returns an
1883 invalid stream position (27.4.3)" to "returns
1884 <tt>pos_type(off_type(-1))</tt>" </p>
1886 <p>In 27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>, paragraph 15, change "Otherwise
1887 returns an invalid stream position (_lib.iostreams.definitions_)"
1888 to "Otherwise returns <tt>pos_type(off_type(-1))</tt>"
1889 </p>
1891 <p>In D.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf.virtuals"> [depr.strstreambuf.virtuals]</a>, paragraph 15, change "the object
1892 stores an invalid stream position" to "the return value is
1893 <tt>pos_type(off_type(-1))</tt>" </p>
1895 <p>In D.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf.virtuals"> [depr.strstreambuf.virtuals]</a>, paragraph 18, change "the object
1896 stores an invalid stream position" to "the return value is
1897 <tt>pos_type(off_type(-1))</tt>"</p>
1898 <hr>
1899 <a name="56"><h3>56.&nbsp;Showmanyc's return type</h3></a><p><b>Section:</b>&nbsp;27.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf"> [lib.streambuf]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;29 Jun 1998</p>
1900 <p>The class summary for basic_streambuf&lt;&gt;, in 27.5.2, says that
1901 showmanyc has return type int. However, 27.5.2.4.3 says that its
1902 return type is streamsize. </p>
1903 <p><b>Proposed resolution:</b></p>
1904 <p>Change <tt>showmanyc</tt>'s return type in the
1905 27.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf"> [lib.streambuf]</a> class summary to <tt>streamsize</tt>.</p>
1906 <hr>
1907 <a name="57"><h3>57.&nbsp;Mistake in char_traits</h3></a><p><b>Section:</b>&nbsp;21.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.specializations.wchar.t"> [lib.char.traits.specializations.wchar.t]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;1 Jul 1998</p>
1908 <p>21.1.3.2, paragraph 3, says "The types streampos and
1909 wstreampos may be different if the implementation supports no shift
1910 encoding in narrow-oriented iostreams but supports one or more shift
1911 encodings in wide-oriented streams". </p>
1913 <p>That's wrong: the two are the same type. The &lt;iosfwd&gt; summary
1914 in 27.2 says that streampos and wstreampos are, respectively, synonyms
1915 for fpos&lt;char_traits&lt;char&gt;::state_type&gt; and
1916 fpos&lt;char_traits&lt;wchar_t&gt;::state_type&gt;, and, flipping back
1917 to clause 21, we see in 21.1.3.1 and 21.1.3.2 that
1918 char_traits&lt;char&gt;::state_type and
1919 char_traits&lt;wchar_t&gt;::state_type must both be mbstate_t. </p>
1920 <p><b>Proposed resolution:</b></p>
1921 <p>Remove the sentence in 21.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.specializations.wchar.t"> [lib.char.traits.specializations.wchar.t]</a> paragraph 3 which
1922 begins "The types streampos and wstreampos may be
1923 different..." . </p>
1924 <hr>
1925 <a name="59"><h3>59.&nbsp;Ambiguity in specification of gbump</h3></a><p><b>Section:</b>&nbsp;27.5.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.get.area"> [lib.streambuf.get.area]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;28 Jul 1998</p>
1926 <p>27.5.2.3.1 says that basic_streambuf::gbump() "Advances the
1927 next pointer for the input sequence by n." </p>
1929 <p>The straightforward interpretation is that it is just gptr() +=
1930 n. An alternative interpretation, though, is that it behaves as if it
1931 calls sbumpc n times. (The issue, of course, is whether it might ever
1932 call underflow.) There is a similar ambiguity in the case of
1933 pbump. </p>
1935 <p>(The "classic" AT&amp;T implementation used the
1936 former interpretation.)</p>
1937 <p><b>Proposed resolution:</b></p>
1938 <p>Change 27.5.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.get.area"> [lib.streambuf.get.area]</a> paragraph 4 gbump effects from:</p>
1940 <blockquote>
1941 <p>Effects: Advances the next pointer for the input sequence by n.</p>
1942 </blockquote>
1944 <p>to:</p>
1946 <blockquote>
1947 <p>Effects: Adds <tt>n</tt> to the next pointer for the input sequence.</p>
1948 </blockquote>
1950 <p>Make the same change to 27.5.2.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.put.area"> [lib.streambuf.put.area]</a> paragraph 4 pbump
1951 effects.</p>
1952 <hr>
1953 <a name="60"><h3>60.&nbsp;What is a formatted input function?</h3></a><p><b>Section:</b>&nbsp;27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;3 Aug 1998</p>
1954 <p>Paragraph 1 of 27.6.1.2.1 contains general requirements for all
1955 formatted input functions. Some of the functions defined in section
1956 27.6.1.2 explicitly say that those requirements apply ("Behaves
1957 like a formatted input member (as described in 27.6.1.2.1)"), but
1958 others don't. The question: is 27.6.1.2.1 supposed to apply to
1959 everything in 27.6.1.2, or only to those member functions that
1960 explicitly say "behaves like a formatted input member"? Or
1961 to put it differently: are we to assume that everything that appears
1962 in a section called "Formatted input functions" really is a
1963 formatted input function? I assume that 27.6.1.2.1 is intended to
1964 apply to the arithmetic extractors (27.6.1.2.2), but I assume that it
1965 is not intended to apply to extractors like </p>
1967 <pre> basic_istream&amp; operator&gt;&gt;(basic_istream&amp; (*pf)(basic_istream&amp;));</pre>
1969 <p>and </p>
1971 <pre> basic_istream&amp; operator&gt;&gt;(basic_streammbuf*);</pre>
1973 <p>There is a similar ambiguity for unformatted input, formatted output, and unformatted
1974 output. </p>
1976 <p>Comments from Judy Ward: It seems like the problem is that the
1977 basic_istream and basic_ostream operator &lt;&lt;()'s that are used
1978 for the manipulators and streambuf* are in the wrong section and
1979 should have their own separate section or be modified to make it clear
1980 that the "Common requirements" listed in section 27.6.1.2.1
1981 (for basic_istream) and section 27.6.2.5.1 (for basic_ostream) do not
1982 apply to them. </p>
1984 <p>Additional comments from Dietmar Kühl: It appears to be somewhat
1985 nonsensical to consider the functions defined in 27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a> paragraphs 1 to 5 to be "Formatted input
1986 function" but since these functions are defined in a section
1987 labeled "Formatted input functions" it is unclear to me
1988 whether these operators are considered formatted input functions which
1989 have to conform to the "common requirements" from 27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a>: If this is the case, all manipulators, not
1990 just <tt>ws</tt>, would skip whitespace unless <tt>noskipws</tt> is
1991 set (... but setting <tt>noskipws</tt> using the manipulator syntax
1992 would also skip whitespace :-)</p> <p>It is not clear which functions
1993 are to be considered unformatted input functions. As written, it seems
1994 that all functions 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> are unformatted input
1995 functions. However, it does not really make much sense to construct a
1996 sentry object for <tt>gcount()</tt>, <tt>sync()</tt>, ... Also it is
1997 unclear what happens to the <tt>gcount()</tt> if
1998 eg. <tt>gcount()</tt>, <tt>putback()</tt>, <tt>unget()</tt>, or
1999 <tt>sync()</tt> is called: These functions don't extract characters,
2000 some of them even "unextract" a character. Should this still
2001 be reflected in <tt>gcount()</tt>? Of course, it could be read as if
2002 after a call to <tt>gcount()</tt> <tt>gcount()</tt> return <tt>0</tt>
2003 (the last unformatted input function, <tt>gcount()</tt>, didn't
2004 extract any character) and after a call to <tt>putback()</tt>
2005 <tt>gcount()</tt> returns <tt>-1</tt> (the last unformatted input
2006 function <tt>putback()</tt> did "extract" back into the
2007 stream). Correspondingly for <tt>unget()</tt>. Is this what is
2008 intended? If so, this should be clarified. Otherwise, a corresponding
2009 clarification should be used.</p>
2010 <p><b>Proposed resolution:</b></p>
2012 In 27.6.1.2.2 [lib.istream.formatted.arithmetic], paragraph 1.
2013 Change the beginning of the second sentence from "The conversion
2014 occurs" to "These extractors behave as formatted input functions (as
2015 described in 27.6.1.2.1). After a sentry object is constructed,
2016 the conversion occurs"
2017 </p>
2020 In 27.6.1.2.3, [lib.istream::extractors], before paragraph 1.
2021 Add an effects clause. "Effects: None. This extractor does
2022 not behave as a formatted input function (as described in
2023 27.6.1.2.1).
2024 </p>
2027 In 27.6.1.2.3, [lib.istream::extractors], paragraph 2. Change the
2028 effects clause to "Effects: Calls pf(*this). This extractor does not
2029 behave as a formatted input function (as described in 27.6.1.2.1).
2030 </p>
2033 In 27.6.1.2.3, [lib.istream::extractors], paragraph 4. Change the
2034 effects clause to "Effects: Calls pf(*this). This extractor does not
2035 behave as a formatted input function (as described in 27.6.1.2.1).
2036 </p>
2039 In 27.6.1.2.3, [lib.istream::extractors], paragraph 12. Change the
2040 first two sentences from "If sb is null, calls setstate(failbit),
2041 which may throw ios_base::failure (27.4.4.3). Extracts characters
2042 from *this..." to "Behaves as a formatted input function (as described
2043 in 27.6.1.2.1). If sb is null, calls setstate(failbit), which may
2044 throw ios_base::failure (27.4.4.3). After a sentry object is
2045 constructed, extracts characters from *this...".
2046 </p>
2049 In 27.6.1.3, [lib.istream.unformatted], before paragraph 2. Add an
2050 effects clause. "Effects: none. This member function does not behave
2051 as an unformatted input function (as described in 27.6.1.3, paragraph 1)."
2052 </p>
2055 In 27.6.1.3, [lib.istream.unformatted], paragraph 3. Change the
2056 beginning of the first sentence of the effects clause from "Extracts a
2057 character" to "Behaves as an unformatted input function (as described
2058 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a
2059 character"
2060 </p>
2063 In 27.6.1.3, [lib.istream.unformatted], paragraph 5. Change the
2064 beginning of the first sentence of the effects clause from "Extracts a
2065 character" to "Behaves as an unformatted input function (as described
2066 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a
2067 character"
2068 </p>
2071 In 27.6.1.3, [lib.istream.unformatted], paragraph 5. Change the
2072 beginning of the first sentence of the effects clause from "Extracts
2073 characters" to "Behaves as an unformatted input function (as described
2074 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts
2075 characters"
2076 </p>
2079 [No change needed in paragraph 10, because it refers to paragraph 7.]
2080 </p>
2083 In 27.6.1.3, [lib.istream.unformatted], paragraph 12. Change the
2084 beginning of the first sentence of the effects clause from "Extracts
2085 characters" to "Behaves as an unformatted input function (as described
2086 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts
2087 characters"
2088 </p>
2091 [No change needed in paragraph 15.]
2092 </p>
2095 In 27.6.1.3, [lib.istream.unformatted], paragraph 17. Change the
2096 beginning of the first sentence of the effects clause from "Extracts
2097 characters" to "Behaves as an unformatted input function (as described
2098 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts
2099 characters"
2100 </p>
2103 [No change needed in paragraph 23.]
2104 </p>
2107 In 27.6.1.3, [lib.istream.unformatted], paragraph 24. Change the
2108 beginning of the first sentence of the effects clause from "Extracts
2109 characters" to "Behaves as an unformatted input function (as described
2110 in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts
2111 characters"
2112 </p>
2115 In 27.6.1.3, [lib.istream.unformatted], before paragraph 27. Add an
2116 Effects clause: "Effects: Behaves as an unformatted input function (as
2117 described in 27.6.1.3, paragraph 1). After constructing a sentry
2118 object, reads but does not extract the current input character."
2119 </p>
2122 In 27.6.1.3, [lib.istream.unformatted], paragraph 28. Change the
2123 first sentence of the Effects clause from "If !good() calls" to
2124 Behaves as an unformatted input function (as described in 27.6.1.3,
2125 paragraph 1). After constructing a sentry object, if !good() calls"
2126 </p>
2129 In 27.6.1.3, [lib.istream.unformatted], paragraph 30. Change the
2130 first sentence of the Effects clause from "If !good() calls" to
2131 "Behaves as an unformatted input function (as described in 27.6.1.3,
2132 paragraph 1). After constructing a sentry object, if !good() calls"
2133 </p>
2136 In 27.6.1.3, [lib.istream.unformatted], paragraph 32. Change the
2137 first sentence of the Effects clause from "If !good() calls..." to
2138 "Behaves as an unformatted input function (as described in 27.6.1.3,
2139 paragraph 1). After constructing a sentry object, if !good()
2140 calls..." Add a new sentence to the end of the Effects clause:
2141 "[Note: this function extracts no characters, so the value returned
2142 by the next call to gcount() is 0.]"
2143 </p>
2146 In 27.6.1.3, [lib.istream.unformatted], paragraph 34. Change the
2147 first sentence of the Effects clause from "If !good() calls" to
2148 "Behaves as an unformatted input function (as described in 27.6.1.3,
2149 paragraph 1). After constructing a sentry object, if !good() calls".
2150 Add a new sentence to the end of the Effects clause: "[Note: this
2151 function extracts no characters, so the value returned by the next
2152 call to gcount() is 0.]"
2153 </p>
2156 In 27.6.1.3, [lib.istream.unformatted], paragraph 36. Change the
2157 first sentence of the Effects clause from "If !rdbuf() is" to "Behaves
2158 as an unformatted input function (as described in 27.6.1.3, paragraph
2159 1), except that it does not count the number of characters extracted
2160 and does not affect the value returned by subsequent calls to
2161 gcount(). After constructing a sentry object, if rdbuf() is"
2162 </p>
2165 In 27.6.1.3, [lib.istream.unformatted], before paragraph 37. Add an
2166 Effects clause: "Effects: Behaves as an unformatted input function (as
2167 described in 27.6.1.3, paragraph 1), except that it does not count the
2168 number of characters extracted and does not affect the value returned
2169 by subsequent calls to gcount()." Change the first sentence of
2170 paragraph 37 from "if fail()" to "after constructing a sentry object,
2171 if fail()".
2172 </p>
2175 In 27.6.1.3, [lib.istream.unformatted], paragraph 38. Change the
2176 first sentence of the Effects clause from "If fail()" to "Behaves
2177 as an unformatted input function (as described in 27.6.1.3, paragraph
2178 1), except that it does not count the number of characters extracted
2179 and does not affect the value returned by subsequent calls to
2180 gcount(). After constructing a sentry object, if fail()
2181 </p>
2184 In 27.6.1.3, [lib.istream.unformatted], paragraph 40. Change the
2185 first sentence of the Effects clause from "If fail()" to "Behaves
2186 as an unformatted input function (as described in 27.6.1.3, paragraph
2187 1), except that it does not count the number of characters extracted
2188 and does not affect the value returned by subsequent calls to
2189 gcount(). After constructing a sentry object, if fail()
2190 </p>
2193 In 27.6.2.5.2 [lib.ostream.inserters.arithmetic], paragraph 1. Change
2194 the beginning of the third sentence from "The formatting conversion"
2195 to "These extractors behave as formatted output functions (as
2196 described in 27.6.2.5.1). After the sentry object is constructed, the
2197 conversion occurs".
2198 </p>
2201 In 27.6.2.5.3 [lib.ostream.inserters], before paragraph 1. Add an
2202 effects clause: "Effects: None. Does not behave as a formatted output
2203 function (as described in 27.6.2.5.1).".
2204 </p>
2207 In 27.6.2.5.3 [lib.ostream.inserters], paragraph 2. Change the
2208 effects clause to "Effects: calls pf(*this). This extractor does not
2209 behave as a formatted output function (as described in 27.6.2.5.1).".
2210 </p>
2213 In 27.6.2.5.3 [lib.ostream.inserters], paragraph 4. Change the
2214 effects clause to "Effects: calls pf(*this). This extractor does not
2215 behave as a formatted output function (as described in 27.6.2.5.1).".
2216 </p>
2219 In 27.6.2.5.3 [lib.ostream.inserters], paragraph 6. Change the first
2220 sentence from "If sb" to "Behaves as a formatted output function (as
2221 described in 27.6.2.5.1). After the sentry object is constructed, if
2222 sb".
2223 </p>
2226 In 27.6.2.6 [lib.ostream.unformatted], paragraph 2. Change the first
2227 sentence from "Inserts the character" to "Behaves as an unformatted
2228 output function (as described in 27.6.2.6, paragraph 1). After
2229 constructing a sentry object, inserts the character".
2230 </p>
2233 In 27.6.2.6 [lib.ostream.unformatted], paragraph 5. Change the first
2234 sentence from "Obtains characters" to "Behaves as an unformatted
2235 output function (as described in 27.6.2.6, paragraph 1). After
2236 constructing a sentry object, obtains characters".
2237 </p>
2240 In 27.6.2.6 [lib.ostream.unformatted], paragraph 7. Add a new
2241 sentence at the end of the paragraph: "Does not behave as an
2242 unformatted output function (as described in 27.6.2.6, paragraph 1)."
2243 </p>
2244 <p><b>Rationale:</b></p>
2245 <p>See J16/99-0043==WG21/N1219, Proposed Resolution to Library Issue 60,
2246 by Judy Ward and Matt Austern. This proposed resolution is section
2247 VI of that paper.</p>
2248 <hr>
2249 <a name="61"><h3>61.&nbsp;Ambiguity in iostreams exception policy</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
2250 <p>The introduction to the section on unformatted input (27.6.1.3)
2251 says that every unformatted input function catches all exceptions that
2252 were thrown during input, sets badbit, and then conditionally rethrows
2253 the exception. That seems clear enough. Several of the specific
2254 functions, however, such as get() and read(), are documented in some
2255 circumstances as setting eofbit and/or failbit. (The standard notes,
2256 correctly, that setting eofbit or failbit can sometimes result in an
2257 exception being thrown.) The question: if one of these functions
2258 throws an exception triggered by setting failbit, is this an exception
2259 "thrown during input" and hence covered by 27.6.1.3, or does
2260 27.6.1.3 only refer to a limited class of exceptions? Just to make
2261 this concrete, suppose you have the following snippet. </p>
2263 <pre>
2264 char buffer[N];
2265 istream is;
2267 is.exceptions(istream::failbit); // Throw on failbit but not on badbit.
2268 is.read(buffer, N);</pre>
2270 <p>Now suppose we reach EOF before we've read N characters. What
2271 iostate bits can we expect to be set, and what exception (if any) will
2272 be thrown? </p>
2273 <p><b>Proposed resolution:</b></p>
2275 In 27.6.1.3, paragraph 1, after the sentence that begins
2276 "If an exception is thrown...", add the following
2277 parenthetical comment: "(Exceptions thrown from
2278 <tt>basic_ios&lt;&gt;::clear()</tt> are not caught or rethrown.)"
2279 </p>
2280 <p><b>Rationale:</b></p>
2281 <p>The LWG looked to two alternative wordings, and choose the proposed
2282 resolution as better standardese.</p>
2283 <hr>
2284 <a name="62"><h3>62.&nbsp;<tt>Sync</tt>'s return value</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;6 Aug 1998</p>
2285 <p>The Effects clause for sync() (27.6.1.3, paragraph 36) says that it
2286 "calls rdbuf()-&gt;pubsync() and, if that function returns -1
2287 ... returns traits::eof()." </p>
2289 <p>That looks suspicious, because traits::eof() is of type
2290 traits::int_type while the return type of sync() is int. </p>
2291 <p><b>Proposed resolution:</b></p>
2292 <p>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 36, change "returns
2293 <tt>traits::eof()</tt>" to "returns <tt>-1</tt>".
2294 </p>
2295 <hr>
2296 <a name="63"><h3>63.&nbsp;Exception-handling policy for unformatted output</h3></a><p><b>Section:</b>&nbsp;27.6.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.unformatted"> [lib.ostream.unformatted]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;11 Aug 1998</p>
2297 <p>Clause 27 details an exception-handling policy for formatted input,
2298 unformatted input, and formatted output. It says nothing for
2299 unformatted output (27.6.2.6). 27.6.2.6 should either include the same
2300 kind of exception-handling policy as in the other three places, or
2301 else it should have a footnote saying that the omission is
2302 deliberate. </p>
2303 <p><b>Proposed resolution:</b></p>
2305 In 27.6.2.6, paragraph 1, replace the last sentence ("In any
2306 case, the unformatted output function ends by destroying the sentry
2307 object, then returning the value specified for the formatted output
2308 function.") with the following text:
2309 </p>
2310 <blockquote>
2311 If an exception is thrown during output, then <tt>ios::badbit</tt> is
2312 turned on [Footnote: without causing an <tt>ios::failure</tt> to be
2313 thrown.] in <tt>*this</tt>'s error state. If <tt>(exceptions() &amp;
2314 badbit) != 0</tt> then the exception is rethrown. In any case, the
2315 unformatted output function ends by destroying the sentry object,
2316 then, if no exception was thrown, returning the value specified for
2317 the formatted output function.
2318 </blockquote>
2319 <p><b>Rationale:</b></p>
2321 This exception-handling policy is consistent with that of formatted
2322 input, unformatted input, and formatted output.
2323 </p>
2324 <hr>
2325 <a name="64"><h3>64.&nbsp;Exception handling in <tt>basic_istream::operator&gt;&gt;(basic_streambuf*)</tt>
2326 </h3></a><p><b>Section:</b>&nbsp;27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;11 Aug 1998 </p>
2327 <p>27.6.1.2.3, paragraph 13, is ambiguous. It can be interpreted two
2328 different ways, depending on whether the second sentence is read as an
2329 elaboration of the first. </p>
2330 <p><b>Proposed resolution:</b></p>
2331 <p>Replace 27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>, paragraph 13, which begins
2332 "If the function inserts no characters ..." with:</p>
2334 <blockquote>
2335 <p>If the function inserts no characters, it calls
2336 <tt>setstate(failbit)</tt>, which may throw
2337 <tt>ios_base::failure</tt> (27.4.4.3). If it inserted no characters
2338 because it caught an exception thrown while extracting characters
2339 from <tt>sb</tt> and <tt>failbit</tt> is on in <tt>exceptions()</tt>
2340 (27.4.4.3), then the caught exception is rethrown. </p>
2341 </blockquote>
2342 <hr>
2343 <a name="66"><h3>66.&nbsp;Strstreambuf::setbuf</h3></a><p><b>Section:</b>&nbsp;D.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf.virtuals"> [depr.strstreambuf.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;18 Aug 1998</p>
2344 <p>D.7.1.3, paragraph 19, says that strstreambuf::setbuf
2345 "Performs an operation that is defined separately for each class
2346 derived from strstreambuf". This is obviously an incorrect
2347 cut-and-paste from basic_streambuf. There are no classes derived from
2348 strstreambuf. </p>
2349 <p><b>Proposed resolution:</b></p>
2350 <p>D.7.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstreambuf.virtuals"> [depr.strstreambuf.virtuals]</a>, paragraph 19, replace the setbuf effects
2351 clause which currently says "Performs an operation that is
2352 defined separately for each class derived from strstreambuf"
2353 with:</p>
2355 <blockquote>
2356 <p><b>Effects</b>: implementation defined, except that
2357 <tt>setbuf(0,0)</tt> has no effect.</p>
2358 </blockquote>
2359 <hr>
2360 <a name="68"><h3>68.&nbsp;Extractors for char* should store null at end</h3></a><p><b>Section:</b>&nbsp;27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;14 Jul 1998</p>
2361 <p>Extractors for char* (27.6.1.2.3) do not store a null character
2362 after the extracted character sequence whereas the unformatted
2363 functions like get() do. Why is this?</p>
2365 <p>Comment from Jerry Schwarz: There is apparently an editing
2366 glitch. You'll notice that the last item of the list of what stops
2367 extraction doesn't make any sense. It was supposed to be the line that
2368 said a null is stored.</p>
2369 <p><b>Proposed resolution:</b></p>
2370 <p>27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>, paragraph 7, change the last list
2371 item from:</p>
2373 <blockquote>
2374 A null byte (<tt>charT()</tt>) in the next position, which may be
2375 the first position if no characters were extracted.
2376 </blockquote>
2378 <p>to become a new paragraph which reads:</p>
2380 <blockquote>
2381 Operator&gt;&gt; then stores a null byte (<tt>charT()</tt>) in the
2382 next position, which may be the first position if no characters were
2383 extracted.
2384 </blockquote>
2385 <hr>
2386 <a name="69"><h3>69.&nbsp;Must elements of a vector be contiguous?</h3></a><p><b>Section:</b>&nbsp;23.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector"> [lib.vector]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;29 Jul 1998</p>
2387 <p>The issue is this: Must the elements of a vector be in contiguous memory?</p>
2389 <p>(Please note that this is entirely separate from the question of
2390 whether a vector iterator is required to be a pointer; the answer to
2391 that question is clearly "no," as it would rule out
2392 debugging implementations)</p>
2393 <p><b>Proposed resolution:</b></p>
2394 <p>Add the following text to the end of 23.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector"> [lib.vector]</a>,
2395 paragraph 1. </p>
2397 <blockquote>
2398 <p>The elements of a vector are stored contiguously, meaning that if
2399 v is a <tt>vector&lt;T, Allocator&gt;</tt> where T is some type
2400 other than <tt>bool</tt>, then it obeys the identity <tt>&amp;v[n]
2401 == &amp;v[0] + n</tt> for all <tt>0 &lt;= n &lt; v.size()</tt>.</p>
2402 </blockquote>
2403 <p><b>Rationale:</b></p>
2404 <p>The LWG feels that as a practical matter the answer is clearly
2405 "yes". There was considerable discussion as to the best way
2406 to express the concept of "contiguous", which is not
2407 directly defined in the standard. Discussion included:</p>
2409 <ul>
2410 <li>An operational definition similar to the above proposed resolution is
2411 already used for valarray (26.3.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.access"> [lib.valarray.access]</a>).</li>
2412 <li>There is no need to explicitly consider a user-defined operator&amp;
2413 because elements must be copyconstructible (23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> para 3)
2414 and copyconstructible (20.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.copyconstructible"> [lib.copyconstructible]</a>) specifies
2415 requirements for operator&amp;.</li>
2416 <li>There is no issue of one-past-the-end because of language rules.</li>
2417 </ul>
2418 <hr>
2419 <a name="70"><h3>70.&nbsp;Uncaught_exception() missing throw() specification</h3></a><p><b>Section:</b>&nbsp;18.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.support.exception"> [lib.support.exception]</a>, 18.6.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.uncaught"> [lib.uncaught]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;Unknown</p>
2420 <p>In article 3E04@pratique.fr, Valentin Bonnard writes: </p>
2422 <p>uncaught_exception() doesn't have a throw specification.</p>
2424 <p>It is intentional ? Does it means that one should be prepared to
2425 handle exceptions thrown from uncaught_exception() ?</p>
2427 <p>uncaught_exception() is called in exception handling contexts where
2428 exception safety is very important.</p>
2429 <p><b>Proposed resolution:</b></p>
2430 <p>In 15.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/except.html#except.uncaught"> [except.uncaught]</a>, paragraph 1, 18.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.support.exception"> [lib.support.exception]</a>, and 18.6.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.uncaught"> [lib.uncaught]</a>, add "throw()" to uncaught_exception().</p>
2431 <hr>
2432 <a name="71"><h3>71.&nbsp;Do_get_monthname synopsis missing argument</h3></a><p><b>Section:</b>&nbsp;22.2.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.get"> [lib.locale.time.get]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;13 Aug 1998</p>
2433 <p>The locale facet member <tt>time_get&lt;&gt;::do_get_monthname</tt>
2434 is described in 22.2.5.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.get.virtuals"> [lib.locale.time.get.virtuals]</a> with five arguments,
2435 consistent with do_get_weekday and with its specified use by member
2436 get_monthname. However, in the synopsis, it is specified instead with
2437 four arguments. The missing argument is the "end" iterator
2438 value.</p>
2439 <p><b>Proposed resolution:</b></p>
2440 <p>In 22.2.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.get"> [lib.locale.time.get]</a>, add an "end" argument to
2441 the declaration of member do_monthname as follows:</p>
2443 <pre> virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&amp;,
2444 ios_base::iostate&amp; err, tm* t) const;</pre>
2445 <hr>
2446 <a name="74"><h3>74.&nbsp;Garbled text for <tt>codecvt::do_max_length</tt>
2447 </h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;8 Sep 1998</p>
2448 <p>The text of <tt>codecvt::do_max_length</tt>'s "Returns"
2449 clause (22.2.1.5.2, paragraph 11) is garbled. It has unbalanced
2450 parentheses and a spurious <b>n</b>.</p>
2451 <p><b>Proposed resolution:</b></p>
2452 <p>Replace 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> paragraph 11 with the
2453 following:</p>
2455 <blockquote>
2456 <b>Returns</b>: The maximum value that
2457 <tt>do_length(state, from, from_end, 1)</tt> can return for any
2458 valid range <tt>[from, from_end)</tt> and <tt>stateT</tt> value
2459 <tt>state</tt>. The specialization <tt>codecvt&lt;char, char,
2460 mbstate_t&gt;::do_max_length()</tt> returns 1.
2461 </blockquote>
2462 <hr>
2463 <a name="75"><h3>75.&nbsp;Contradiction in <tt>codecvt::length</tt>'s argument types</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp; Matt
2464 Austern&nbsp; <b>Date:</b>&nbsp; 18 Sep 1998</p>
2465 <p>The class synopses for classes <tt>codecvt&lt;&gt;</tt> (22.2.1.5)
2466 and <tt>codecvt_byname&lt;&gt;</tt> (22.2.1.6) say that the first
2467 parameter of the member functions <tt>length</tt> and
2468 <tt>do_length</tt> is of type <tt>const stateT&amp;</tt>. The member
2469 function descriptions, however (22.2.1.5.1, paragraph 6; 22.2.1.5.2,
2470 paragraph 9) say that the type is <tt>stateT&amp;</tt>. Either the
2471 synopsis or the summary must be changed. </p>
2473 <p>If (as I believe) the member function descriptions are correct,
2474 then we must also add text saying how <tt>do_length</tt> changes its
2475 <tt>stateT</tt> argument. </p>
2476 <p><b>Proposed resolution:</b></p>
2477 <p>In 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>, and also in 22.2.1.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt.byname"> [lib.locale.codecvt.byname]</a>,
2478 change the <tt>stateT</tt> argument type on both member
2479 <tt>length()</tt> and member <tt>do_length()</tt> from </p>
2481 <blockquote>
2482 <p><tt>const stateT&amp;</tt></p>
2483 </blockquote>
2485 <p>to</p>
2487 <blockquote>
2488 <p><tt>stateT&amp;</tt></p>
2489 </blockquote>
2491 <p>In 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>, add to the definition for member
2492 <tt>do_length</tt> a paragraph:</p>
2494 <blockquote>
2495 <p>Effects: The effect on the <tt>state</tt> argument is ``as if''
2496 it called <tt>do_in(state, from, from_end, from, to, to+max,
2497 to)</tt> for <tt>to</tt> pointing to a buffer of at least
2498 <tt>max</tt> elements.</p>
2499 </blockquote>
2500 <hr>
2501 <a name="76"><h3>76.&nbsp;Can a <tt>codecvt</tt> facet always convert one internal character at a time?</h3></a><p><b>Section:</b>&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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;25 Sep 1998</p>
2502 <p>This issue concerns the requirements on classes derived from
2503 <tt>codecvt</tt>, including user-defined classes. What are the
2504 restrictions on the conversion from external characters
2505 (e.g. <tt>char</tt>) to internal characters (e.g. <tt>wchar_t</tt>)?
2506 Or, alternatively, what assumptions about <tt>codecvt</tt> facets can
2507 the I/O library make? </p>
2509 <p>The question is whether it's possible to convert from internal
2510 characters to external characters one internal character at a time,
2511 and whether, given a valid sequence of external characters, it's
2512 possible to pick off internal characters one at a time. Or, to put it
2513 differently: given a sequence of external characters and the
2514 corresponding sequence of internal characters, does a position in the
2515 internal sequence correspond to some position in the external
2516 sequence? </p>
2518 <p>To make this concrete, suppose that <tt>[first, last)</tt> is a
2519 sequence of <i>M</i> external characters and that <tt>[ifirst,
2520 ilast)</tt> is the corresponding sequence of <i>N</i> internal
2521 characters, where <i>N &gt; 1</i>. That is, <tt>my_encoding.in()</tt>,
2522 applied to <tt>[first, last)</tt>, yields <tt>[ifirst,
2523 ilast)</tt>. Now the question: does there necessarily exist a
2524 subsequence of external characters, <tt>[first, last_1)</tt>, such
2525 that the corresponding sequence of internal characters is the single
2526 character <tt>*ifirst</tt>?
2527 </p>
2529 <p>(What a "no" answer would mean is that
2530 <tt>my_encoding</tt> translates sequences only as blocks. There's a
2531 sequence of <i>M</i> external characters that maps to a sequence of
2532 <i>N</i> internal characters, but that external sequence has no
2533 subsequence that maps to <i>N-1</i> internal characters.) </p>
2535 <p>Some of the wording in the standard, such as the description of
2536 <tt>codecvt::do_max_length</tt> (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>,
2537 paragraph 11) and <tt>basic_filebuf::underflow</tt> (27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>, paragraph 3) suggests that it must always be
2538 possible to pick off internal characters one at a time from a sequence
2539 of external characters. However, this is never explicitly stated one
2540 way or the other. </p>
2542 <p>This issue seems (and is) quite technical, but it is important if
2543 we expect users to provide their own encoding facets. This is an area
2544 where the standard library calls user-supplied code, so a well-defined
2545 set of requirements for the user-supplied code is crucial. Users must
2546 be aware of the assumptions that the library makes. This issue affects
2547 positioning operations on <tt>basic_filebuf</tt>, unbuffered input,
2548 and several of <tt>codecvt</tt>'s member functions. </p>
2549 <p><b>Proposed resolution:</b></p>
2550 <p>Add the following text as a new paragraph, following 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> paragraph 2:</p>
2552 <blockquote>
2553 <p>A <tt>codecvt</tt> facet that is used by <tt>basic_filebuf</tt>
2554 (27.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.file.streams"> [lib.file.streams]</a>) must have the property that if</p>
2555 <pre> do_out(state, from, from_end, from_next, to, to_lim, to_next)
2556 </pre>
2557 would return <tt>ok</tt>, where <tt>from != from_end</tt>, then
2558 <pre> do_out(state, from, from + 1, from_next, to, to_end, to_next)
2559 </pre>
2560 must also return <tt>ok</tt>, and that if
2561 <pre> do_in(state, from, from_end, from_next, to, to_lim, to_next)
2562 </pre>
2563 would return <tt>ok</tt>, where <tt>to != to_lim</tt>, then
2564 <pre> do_in(state, from, from_end, from_next, to, to + 1, to_next)
2565 </pre>
2566 <p>must also return <tt>ok</tt>. [<i>Footnote:</i> Informally, this
2567 means that <tt>basic_filebuf</tt> assumes that the mapping from
2568 internal to external characters is 1 to N: a <tt>codecvt</tt> that is
2569 used by <tt>basic_filebuf</tt> must be able to translate characters
2570 one internal character at a time. <i>--End Footnote</i>]</p>
2571 </blockquote>
2573 <p><i>[Redmond: Minor change in proposed resolution. Original
2574 proposed resolution talked about "success", with a parenthetical
2575 comment that success meant returning <tt>ok</tt>. New wording
2576 removes all talk about "success", and just talks about the
2577 return value.]</i></p>
2579 <p><b>Rationale:</b></p>
2581 <p>The proposed resoluion says that conversions can be performed one
2582 internal character at a time. This rules out some encodings that
2583 would otherwise be legal. The alternative answer would mean there
2584 would be some internal positions that do not correspond to any
2585 external file position.</p>
2587 An example of an encoding that this rules out is one where the
2588 <tt>internT</tt> and <tt>externT</tt> are of the same type, and
2589 where the internal sequence <tt>c1 c2</tt> corresponds to the
2590 external sequence <tt>c2 c1</tt>.
2591 </p>
2592 <p>It was generally agreed that <tt>basic_filebuf</tt> relies
2593 on this property: it was designed under the assumption that
2594 the external-to-internal mapping is N-to-1, and it is not clear
2595 that <tt>basic_filebuf</tt> is implementable without that
2596 restriction.
2597 </p>
2599 The proposed resolution is expressed as a restriction on
2600 <tt>codecvt</tt> when used by <tt>basic_filebuf</tt>, rather
2601 than a blanket restriction on all <tt>codecvt</tt> facets,
2602 because <tt>basic_filebuf</tt> is the only other part of the
2603 library that uses <tt>codecvt</tt>. If a user wants to define
2604 a <tt>codecvt</tt> facet that implements a more general N-to-M
2605 mapping, there is no reason to prohibit it, so long as the user
2606 does not expect <tt>basic_filebuf</tt> to be able to use it.
2607 </p>
2608 <hr>
2609 <a name="78"><h3>78.&nbsp;Typo: event_call_back</h3></a><p><b>Section:</b>&nbsp;27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2610 <p>typo: event_call_back should be event_callback &nbsp; </p>
2611 <p><b>Proposed resolution:</b></p>
2612 <p>In the 27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a> synopsis change
2613 "event_call_back" to "event_callback". </p>
2614 <hr>
2615 <a name="79"><h3>79.&nbsp;Inconsistent declaration of polar()</h3></a><p><b>Section:</b>&nbsp;26.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.synopsis"> [lib.complex.synopsis]</a>, 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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2616 <p>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> polar is declared as follows:</p>
2617 <pre> template&lt;class T&gt; complex&lt;T&gt; polar(const T&amp;, const T&amp;); </pre>
2619 <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> it is declared as follows:</p>
2620 <pre> template&lt;class T&gt; complex&lt;T&gt; polar(const T&amp; rho, const T&amp; theta = 0); </pre>
2622 <p>Thus whether the second parameter is optional is not clear. </p>
2623 <p><b>Proposed resolution:</b></p>
2624 <p>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> change:</p>
2625 <pre> template&lt;class T&gt; complex&lt;T&gt; polar(const T&amp;, const T&amp;);</pre>
2627 <p>to:</p>
2628 <pre> template&lt;class T&gt; complex&lt;T&gt; polar(const T&amp; rho, const T&amp; theta = 0); </pre>
2629 <hr>
2630 <a name="80"><h3>80.&nbsp;Global Operators of complex declared twice</h3></a><p><b>Section:</b>&nbsp;26.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.synopsis"> [lib.complex.synopsis]</a>, 26.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex"> [lib.complex]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2631 <p>Both 26.2.1 and 26.2.2 contain declarations of global operators for
2632 class complex. This redundancy should be removed.</p>
2633 <p><b>Proposed resolution:</b></p>
2634 <p>Reduce redundancy according to the general style of the standard. </p>
2635 <hr>
2636 <a name="83"><h3>83.&nbsp;String::npos vs. string::max_size()</h3></a><p><b>Section:</b>&nbsp;21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2637 <p>Many string member functions throw if size is getting or exceeding
2638 npos. However, I wonder why they don't throw if size is getting or
2639 exceeding max_size() instead of npos. May be npos is known at compile
2640 time, while max_size() is known at runtime. However, what happens if
2641 size exceeds max_size() but not npos, then? It seems the standard
2642 lacks some clarifications here.</p>
2643 <p><b>Proposed resolution:</b></p>
2644 <p>After 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a> paragraph 4 ("The functions
2645 described in this clause...") add a new paragraph:</p>
2647 <blockquote>
2648 <p>For any string operation, if as a result of the operation, <tt> size()</tt> would exceed
2649 <tt> max_size()</tt> then
2650 the operation throws <tt>length_error</tt>.</p>
2651 </blockquote>
2652 <p><b>Rationale:</b></p>
2653 <p>The LWG believes length_error is the correct exception to throw.</p>
2654 <hr>
2655 <a name="86"><h3>86.&nbsp;String constructors don't describe exceptions</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2656 <p>The constructor from a range:</p>
2658 <pre>template&lt;class InputIterator&gt;
2659 basic_string(InputIterator begin, InputIterator end,
2660 const Allocator&amp; a = Allocator());</pre>
2662 <p>lacks a throws clause. However, I would expect that it throws
2663 according to the other constructors if the numbers of characters in
2664 the range equals npos (or exceeds max_size(), see above). </p>
2665 <p><b>Proposed resolution:</b></p>
2666 <p>In 21.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a>, Strike throws paragraphs for
2667 constructors which say "Throws: length_error if n ==
2668 npos."</p>
2669 <p><b>Rationale:</b></p>
2670 <p>Throws clauses for length_error if n == npos are no longer needed
2671 because they are subsumed by the general wording added by the
2672 resolution for issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#83">83</a>.</p>
2673 <hr>
2674 <a name="90"><h3>90.&nbsp;Incorrect description of operator &gt;&gt; for strings</h3></a><p><b>Section:</b>&nbsp;21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2675 <p>The effect of operator &gt;&gt; for strings contain the following item:</p>
2677 <p>&nbsp;&nbsp;&nbsp; <tt>isspace(c,getloc())</tt> is true for the next available input
2678 character c.</p>
2680 <p>Here <tt>getloc()</tt> has to be replaced by <tt>is.getloc()</tt>. </p>
2681 <p><b>Proposed resolution:</b></p>
2682 <p>In 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a> paragraph 1 Effects clause replace:</p>
2684 <blockquote>
2685 <p><tt>isspace(c,getloc())</tt> is true for the next available input character c.</p>
2686 </blockquote>
2688 <p>with:</p>
2690 <blockquote>
2691 <p><tt>isspace(c,is.getloc())</tt> is true for the next available input character c.</p>
2692 </blockquote>
2693 <hr>
2694 <a name="91"><h3>91.&nbsp;Description of operator&gt;&gt; and getline() for string&lt;&gt; might cause endless loop</h3></a><p><b>Section:</b>&nbsp;21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2695 <p>Operator &gt;&gt; and getline() for strings read until eof()
2696 in the input stream is true. However, this might never happen, if the
2697 stream can't read anymore without reaching EOF. So shouldn't it be
2698 changed into that it reads until !good() ? </p>
2699 <p><b>Proposed resolution:</b></p>
2700 <p>In 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>, paragraph 1, replace:</p>
2701 <blockquote>
2702 Effects: Begins by constructing a sentry object k as if k were
2703 constructed by typename basic_istream&lt;charT,traits&gt;::sentry k( is). If
2704 bool( k) is true, it calls str.erase() and then extracts characters
2705 from is and appends them to str as if by calling str.append(1, c). If
2706 is.width() is greater than zero, the maximum number n of characters
2707 appended is is.width(); otherwise n is str.max_size(). Characters are
2708 extracted and appended until any of the following occurs:
2709 </blockquote>
2710 <p>with:</p>
2711 <blockquote>
2712 Effects: Behaves as a formatted input function (27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a>). After constructing a sentry object, if the
2713 sentry converts to true, calls str.erase() and then extracts
2714 characters from is and appends them to str as if by calling
2715 str.append(1,c). If is.width() is greater than zero, the maximum
2716 number n of characters appended is is.width(); otherwise n is
2717 str.max_size(). Characters are extracted and appended until any of the
2718 following occurs:
2719 </blockquote>
2721 <p>In 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>, paragraph 6, replace</p>
2722 <blockquote>
2723 Effects: Begins by constructing a sentry object k as if by typename
2724 basic_istream&lt;charT,traits&gt;::sentry k( is, true). If bool( k) is true,
2725 it calls str.erase() and then extracts characters from is and appends
2726 them to str as if by calling str.append(1, c) until any of the
2727 following occurs:
2728 </blockquote>
2729 <p>with:</p>
2730 <blockquote>
2731 Effects: Behaves as an unformatted input function (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>), except that it does not affect the value returned
2732 by subsequent calls to basic_istream&lt;&gt;::gcount(). After
2733 constructing a sentry object, if the sentry converts to true, calls
2734 str.erase() and then extracts characters from is and appends them to
2735 str as if by calling str.append(1,c) until any of the following
2736 occurs:
2737 </blockquote>
2739 <p><i>[Redmond: Made changes in proposed resolution. <tt>operator&gt;&gt;</tt>
2740 should be a formatted input function, not an unformatted input function.
2741 <tt>getline</tt> should not be required to set <tt>gcount</tt>, since
2742 there is no mechanism for <tt>gcount</tt> to be set except by one of
2743 <tt>basic_istream</tt>'s member functions.]</i></p>
2745 <p><i>[Curaçao: Nico agrees with proposed resolution.]</i></p>
2747 <p><b>Rationale:</b></p>
2748 <p>The real issue here is whether or not these string input functions
2749 get their characters from a streambuf, rather than by calling an
2750 istream's member functions, a streambuf signals failure either by
2751 returning eof or by throwing an exception; there are no other
2752 possibilities. The proposed resolution makes it clear that these two
2753 functions do get characters from a streambuf.</p>
2754 <hr>
2755 <a name="92"></a><h3><a name="92">92.&nbsp;Incomplete Algorithm Requirements</a></h3><p><b>Section:</b>&nbsp;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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;29 Sep 1998</p>
2756 <p>The standard does not state, how often a function object is copied,
2757 called, or the order of calls inside an algorithm. This may lead to
2758 surprising/buggy behavior. Consider the following example: </p>
2760 <pre>class Nth { // function object that returns true for the nth element
2761 private:
2762 int nth; // element to return true for
2763 int count; // element counter
2764 public:
2765 Nth (int n) : nth(n), count(0) {
2767 bool operator() (int) {
2768 return ++count == nth;
2771 ....
2772 // remove third element
2773 list&lt;int&gt;::iterator pos;
2774 pos = remove_if(coll.begin(),coll.end(), // range
2775 Nth(3)), // remove criterion
2776 coll.erase(pos,coll.end()); </pre>
2778 <p>This call, in fact removes the 3rd <b>AND the 6th</b> element. This
2779 happens because the usual implementation of the algorithm copies the
2780 function object internally: </p>
2782 <pre>template &lt;class ForwIter, class Predicate&gt;
2783 ForwIter std::remove_if(ForwIter beg, ForwIter end, Predicate op)
2785 beg = find_if(beg, end, op);
2786 if (beg == end) {
2787 return beg;
2789 else {
2790 ForwIter next = beg;
2791 return remove_copy_if(++next, end, beg, op);
2793 } </pre>
2795 <p>The algorithm uses find_if() to find the first element that should
2796 be removed. However, it then uses a copy of the passed function object
2797 to process the resulting elements (if any). Here, Nth is used again
2798 and removes also the sixth element. This behavior compromises the
2799 advantage of function objects being able to have a state. Without any
2800 cost it could be avoided (just implement it directly instead of
2801 calling find_if()). </p>
2802 <p><b>Proposed resolution:</b></p>
2804 <p>Add a new paragraph following 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a> paragraph 8:</p>
2805 <blockquote>
2806 [Note: Unless otherwise specified, algorithms that take function
2807 objects as arguments are permitted to copy those function objects
2808 freely. Programmers for whom object identity is important should
2809 consider using a wrapper class that points to a noncopied
2810 implementation object, or some equivalent solution.]
2811 </blockquote>
2813 <p><i>[Dublin: Pete Becker felt that this may not be a defect,
2814 but rather something that programmers need to be educated about.
2815 There was discussion of adding wording to the effect that the number
2816 and order of calls to function objects, including predicates, not
2817 affect the behavior of the function object.]</i></p>
2819 <p><i>[Pre-Kona: Nico comments: It seems the problem is that we don't
2820 have a clear statement of "predicate" in the
2821 standard. People including me seemed to think "a function
2822 returning a Boolean value and being able to be called by an STL
2823 algorithm or be used as sorting criterion or ... is a
2824 predicate". But a predicate has more requirements: It should
2825 never change its behavior due to a call or being copied. IMHO we have
2826 to state this in the standard. If you like, see section 8.1.4 of my
2827 library book for a detailed discussion.]</i></p>
2829 <p><i>[Kona: Nico will provide wording to the effect that "unless
2830 otherwise specified, the number of copies of and calls to function
2831 objects by algorithms is unspecified".&nbsp; Consider placing in
2832 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a> after paragraph 9.]</i></p>
2834 <p><i>[Santa Cruz: The standard doesn't currently guarantee that
2835 functions object won't be copied, and what isn't forbidden is
2836 allowed. It is believed (especially since implementations that were
2837 written in concert with the standard do make copies of function
2838 objects) that this was intentional. Thus, no normative change is
2839 needed. What we should put in is a non-normative note suggesting to
2840 programmers that if they want to guarantee the lack of copying they
2841 should use something like the <tt>ref</tt> wrapper.]</i></p>
2843 <p><i>[Oxford: Matt provided wording.]</i></p>
2846 <hr>
2847 <a name="98"><h3>98.&nbsp;Input iterator requirements are badly written</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;AFNOR&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
2848 <p>Table 72 in 24.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.input.iterators"> [lib.input.iterators]</a> specifies semantics for
2849 <tt>*r++</tt> of:</p>
2851 <p>&nbsp;&nbsp; <tt>{ T tmp = *r; ++r; return tmp; }</tt></p>
2853 <p>There are two problems with this. First, the return type is
2854 specified to be "T", as opposed to something like "convertible to T".
2855 This is too specific: we want to allow *r++ to return an lvalue.</p>
2857 <p>Second, writing the semantics in terms of code misleadingly
2858 suggests that the effects *r++ should precisely replicate the behavior
2859 of this code, including side effects. (Does this mean that *r++
2860 should invoke the copy constructor exactly as many times as the sample
2861 code above would?) See issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#334">334</a> for a similar
2862 problem.</p>
2864 <p><b>Proposed resolution:</b></p>
2865 In Table 72 in 24.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.input.iterators"> [lib.input.iterators]</a>, change the return type
2866 for <tt>*r++</tt> from <tt>T</tt> to "convertible to T".
2867 <p><b>Rationale:</b></p>
2868 <p>This issue has two parts: the return type, and the number of times
2869 the copy constructor is invoked.</p>
2871 <p>The LWG believes the the first part is a real issue. It's
2872 inappropriate for the return type to be specified so much more
2873 precisely for *r++ than it is for *r. In particular, if r is of
2874 (say) type <tt>int*</tt>, then *r++ isn't <tt>int</tt>,
2875 but <tt>int&amp;</tt>.</p>
2877 <p>The LWG does not believe that the number of times the copy
2878 constructor is invoked is a real issue. This can vary in any case,
2879 because of language rules on copy constructor elision. That's too
2880 much to read into these semantics clauses.</p>
2882 <p>Additionally, as Dave Abrahams pointed out (c++std-lib-13703): since
2883 we're told (24.1/3) that forward iterators satisfy all the requirements
2884 of input iterators, we can't impose any requirements in the Input
2885 Iterator requirements table that forward iterators don't satisfy.</p>
2886 <hr>
2887 <a name="103"><h3>103.&nbsp;set::iterator is required to be modifiable, but this allows modification of keys</h3></a><p><b>Section:</b>&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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;AFNOR&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
2888 <p>Set::iterator is described as implementation-defined with a
2889 reference to the container requirement; the container requirement says
2890 that const_iterator is an iterator pointing to const T and iterator an
2891 iterator pointing to T.</p>
2893 <p>23.1.2 paragraph 2 implies that the keys should not be modified to
2894 break the ordering of elements. But that is not clearly
2895 specified. Especially considering that the current standard requires
2896 that iterator for associative containers be different from
2897 const_iterator. Set, for example, has the following: </p>
2899 <p><tt>typedef implementation defined iterator;<br>
2900 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // See _lib.container.requirements_</tt></p>
2902 <p>23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> actually requires that iterator type pointing
2903 to T (table 65). Disallowing user modification of keys by changing the
2904 standard to require an iterator for associative container to be the
2905 same as const_iterator would be overkill since that will unnecessarily
2906 significantly restrict the usage of associative container. A class to
2907 be used as elements of set, for example, can no longer be modified
2908 easily without either redesigning the class (using mutable on fields
2909 that have nothing to do with ordering), or using const_cast, which
2910 defeats requiring iterator to be const_iterator. The proposed solution
2911 goes in line with trusting user knows what he is doing. </p>
2913 <p><b>Other Options Evaluated:</b> </p>
2915 <p>Option A.&nbsp;&nbsp; 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>, paragraph 2, after
2916 first sentence, and before "In addition,...", add one line:
2917 </p>
2919 <blockquote>
2920 <p>Modification of keys shall not change their strict weak ordering. </p>
2921 </blockquote>
2923 <p>Option B.&nbsp;Add three new sentences to 23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a>:</p>
2925 <blockquote>
2926 <p>At the end of paragraph 5: "Keys in an associative container
2927 are immutable." At the end of paragraph 6: "For
2928 associative containers where the value type is the same as the key
2929 type, both <tt>iterator</tt> and <tt>const_iterator</tt> are
2930 constant iterators. It is unspecified whether or not
2931 <tt>iterator</tt> and <tt>const_iterator</tt> are the same
2932 type."</p>
2933 </blockquote>
2935 <p>Option C.&nbsp;To 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 3, which
2936 currently reads:</p>
2938 <blockquote>
2939 <p>The phrase ``equivalence of keys'' means the equivalence relation imposed by the
2940 comparison and not the operator== on keys. That is, two keys k1 and k2 in the same
2941 container are considered to be equivalent if for the comparison object comp, comp(k1, k2)
2942 == false &amp;&amp; comp(k2, k1) == false.</p>
2943 </blockquote>
2945 <p>&nbsp; add the following:</p>
2947 <blockquote>
2948 <p>For any two keys k1 and k2 in the same container, comp(k1, k2) shall return the same
2949 value whenever it is evaluated. [Note: If k2 is removed from the container and later
2950 reinserted, comp(k1, k2) must still return a consistent value but this value may be
2951 different than it was the first time k1 and k2 were in the same container. This is
2952 intended to allow usage like a string key that contains a filename, where comp compares
2953 file contents; if k2 is removed, the file is changed, and the same k2 (filename) is
2954 reinserted, comp(k1, k2) must again return a consistent value but this value may be
2955 different than it was the previous time k2 was in the container.]</p>
2956 </blockquote>
2957 <p><b>Proposed resolution:</b></p>
2958 <p>Add the following to 23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a> at
2959 the indicated location:</p>
2961 <blockquote>
2962 <p>At the end of paragraph 3: "For any two keys k1 and k2 in the same container,
2963 calling comp(k1, k2) shall always return the same
2964 value."</p>
2965 <p>At the end of paragraph 5: "Keys in an associative container are immutable."</p>
2966 <p>At the end of paragraph 6: "For associative containers where the value type is the
2967 same as the key type, both <tt>iterator</tt> and <tt>const_iterator</tt> are constant
2968 iterators. It is unspecified whether or not <tt>iterator</tt> and <tt>const_iterator</tt>
2969 are the same type."</p>
2970 </blockquote>
2971 <p><b>Rationale:</b></p>
2972 <p>Several arguments were advanced for and against allowing set elements to be
2973 mutable as long as the ordering was not effected. The argument which swayed the
2974 LWG was one of safety; if elements were mutable, there would be no compile-time
2975 way to detect of a simple user oversight which caused ordering to be
2976 modified. There was a report that this had actually happened in practice,
2977 and had been painful to diagnose. If users need to modify elements,
2978 it is possible to use mutable members or const_cast.</p>
2980 <p>Simply requiring that keys be immutable is not sufficient, because the comparison
2981 object may indirectly (via pointers) operate on values outside of the keys.</p>
2984 The types <tt>iterator</tt> and <tt>const_iterator</tt> are permitted
2985 to be different types to allow for potential future work in which some
2986 member functions might be overloaded between the two types. No such
2987 member functions exist now, and the LWG believes that user functionality
2988 will not be impaired by permitting the two types to be the same. A
2989 function that operates on both iterator types can be defined for
2990 <tt>const_iterator</tt> alone, and can rely on the automatic
2991 conversion from <tt>iterator</tt> to <tt>const_iterator</tt>.
2992 </p>
2994 <p><i>[Tokyo: The LWG crafted the proposed resolution and rationale.]</i></p>
2995 <hr>
2996 <a name="106"><h3>106.&nbsp;Numeric library private members are implementation defined</h3></a><p><b>Section:</b>&nbsp;26.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.slice.array"> [lib.template.slice.array]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;AFNOR&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
2997 <p>This is the only place in the whole standard where the implementation has to document
2998 something private.</p>
2999 <p><b>Proposed resolution:</b></p>
3001 Remove the comment which says "// remainder implementation defined" from:
3002 </p>
3004 <ul>
3005 <li>26.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.slice.array"> [lib.template.slice.array]</a>
3006 </li>
3007 <li>26.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.gslice.array"> [lib.template.gslice.array]</a>
3008 </li>
3009 <li>26.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.mask.array"> [lib.template.mask.array]</a>
3010 </li>
3011 <li>26.3.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.indirect.array"> [lib.template.indirect.array]</a>
3012 </li>
3013 </ul>
3014 <hr>
3015 <a name="108"><h3>108.&nbsp;Lifetime of exception::what() return unspecified</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;AFNOR&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
3016 <p>In 18.6.1, paragraphs 8-9, the lifetime of the return value of
3017 exception::what() is left unspecified. This issue has implications
3018 with exception safety of exception handling: some exceptions should
3019 not throw bad_alloc.</p>
3020 <p><b>Proposed resolution:</b></p>
3021 <p>Add to 18.6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.exception"> [lib.exception]</a> paragraph 9 (exception::what notes
3022 clause) the sentence:</p>
3024 <blockquote>
3025 <p>The return value remains valid until the exception object from which it is obtained is
3026 destroyed or a non-const member function of the exception object is called.</p>
3027 </blockquote>
3028 <p><b>Rationale:</b></p>
3029 <p>If an exception object has non-const members, they may be used
3030 to set internal state that should affect the contents of the string
3031 returned by <tt>what()</tt>.
3032 </p>
3033 <hr>
3034 <a name="109"><h3>109.&nbsp;Missing binders for non-const sequence elements</h3></a><p><b>Section:</b>&nbsp;20.3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.binders"> [lib.binders]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Bjarne Stroustrup&nbsp; <b>Date:</b>&nbsp;7 Oct 1998</p>
3036 <p>There are no versions of binders that apply to non-const elements
3037 of a sequence. This makes examples like for_each() using bind2nd() on
3038 page 521 of "The C++ Programming Language (3rd)"
3039 non-conforming. Suitable versions of the binders need to be added.</p>
3041 <p>Further discussion from Nico:</p>
3043 <p>What is probably meant here is shown in the following example:</p>
3045 <pre>class Elem {
3046 public:
3047 void print (int i) const { }
3048 void modify (int i) { }
3049 }; </pre>
3050 <pre>int main()
3052 vector&lt;Elem&gt; coll(2);
3053 for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&amp;Elem::print),42)); // OK
3054 for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&amp;Elem::modify),42)); // ERROR
3055 }</pre>
3057 <p>The error results from the fact that bind2nd() passes its first
3058 argument (the argument of the sequence) as constant reference. See the
3059 following typical implementation:</p>
3061 <blockquote>
3062 <pre>template &lt;class Operation&gt;
3063 class binder2nd
3064 : public unary_function&lt;typename Operation::first_argument_type,
3065 typename Operation::result_type&gt; {
3066 protected:
3067 Operation op;
3068 typename Operation::second_argument_type value;
3069 public:
3070 binder2nd(const Operation&amp; o,
3071 const typename Operation::second_argument_type&amp; v)
3072 : op(o), value(v) {} </pre>
3073 <pre> typename Operation::result_type
3074 operator()(const typename Operation::first_argument_type&amp; x) const {
3075 return op(x, value);
3077 };</pre>
3078 </blockquote>
3080 <p>The solution is to overload operator () of bind2nd for non-constant arguments:</p>
3082 <blockquote>
3083 <pre>template &lt;class Operation&gt;
3084 class binder2nd
3085 : public unary_function&lt;typename Operation::first_argument_type,
3086 typename Operation::result_type&gt; {
3087 protected:
3088 Operation op;
3089 typename Operation::second_argument_type value;
3090 public:
3091 binder2nd(const Operation&amp; o,
3092 const typename Operation::second_argument_type&amp; v)
3093 : op(o), value(v) {} </pre>
3094 <pre> typename Operation::result_type
3095 operator()(const typename Operation::first_argument_type&amp; x) const {
3096 return op(x, value);
3098 typename Operation::result_type
3099 operator()(typename Operation::first_argument_type&amp; x) const {
3100 return op(x, value);
3102 };</pre>
3103 </blockquote>
3104 <p><b>Proposed resolution:</b></p>
3106 <p><b>Howard believes there is a flaw</b> in this resolution.
3107 See c++std-lib-9127. We may need to reopen this issue.</p>
3109 <p>In 20.3.6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.binder.1st"> [lib.binder.1st]</a> in the declaration of binder1st after:</p>
3110 <blockquote>
3111 <p><tt>typename Operation::result_type<br>
3112 &nbsp;operator()(const typename Operation::second_argument_type&amp; x) const;</tt></p>
3113 </blockquote>
3114 <p>insert:</p>
3115 <blockquote>
3116 <p><tt>typename Operation::result_type<br>
3117 &nbsp;operator()(typename Operation::second_argument_type&amp; x) const;</tt></p>
3118 </blockquote>
3119 <p>In 20.3.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.binder.2nd"> [lib.binder.2nd]</a> in the declaration of binder2nd after:</p>
3120 <blockquote>
3121 <p><tt>typename Operation::result_type<br>
3122 &nbsp;operator()(const typename Operation::first_argument_type&amp; x) const;</tt></p>
3123 </blockquote>
3124 <p>insert:</p>
3125 <blockquote>
3126 <p><tt>typename Operation::result_type<br>
3127 &nbsp;operator()(typename Operation::first_argument_type&amp; x) const;</tt></p>
3128 </blockquote>
3130 <p><i>[Kona: The LWG discussed this at some length.It was agreed that
3131 this is a mistake in the design, but there was no consensus on whether
3132 it was a defect in the Standard. Straw vote: NAD - 5. Accept
3133 proposed resolution - 3. Leave open - 6.]</i></p>
3135 <p><i>[Copenhagen: It was generally agreed that this was a defect.
3136 Strap poll: NAD - 0. Accept proposed resolution - 10.
3137 Leave open - 1.]</i></p>
3139 <hr>
3140 <a name="110"><h3>110.&nbsp;istreambuf_iterator::equal not const</h3></a><p><b>Section:</b>&nbsp;24.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator"> [lib.istreambuf.iterator]</a>, 24.5.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator::equal"> [lib.istreambuf.iterator::equal]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;15 Oct 1998</p>
3141 <p>Member istreambuf_iterator&lt;&gt;::equal is not declared
3142 "const", yet 24.5.3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator::op=="> [lib.istreambuf.iterator::op==]</a> says that operator==,
3143 which is const, calls it. This is contradictory. </p>
3144 <p><b>Proposed resolution:</b></p>
3145 <p>In 24.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator"> [lib.istreambuf.iterator]</a> and also in 24.5.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator::equal"> [lib.istreambuf.iterator::equal]</a>,
3146 replace:</p>
3148 <blockquote>
3149 <pre>bool equal(istreambuf_iterator&amp; b);</pre>
3150 </blockquote>
3152 <p>with:</p>
3154 <blockquote>
3155 <pre>bool equal(const istreambuf_iterator&amp; b) const;</pre>
3156 </blockquote>
3157 <hr>
3158 <a name="112"><h3>112.&nbsp;Minor typo in <tt>ostreambuf_iterator</tt> constructor</h3></a><p><b>Section:</b>&nbsp;24.5.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.ostreambuf.iter.cons"> [lib.ostreambuf.iter.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;20 Oct 1998</p>
3159 <p>The <b>requires</b> clause for <tt>ostreambuf_iterator</tt>'s
3160 constructor from an <tt>ostream_type</tt> (24.5.4.1, paragraph 1)
3161 reads "<i>s</i> is not null". However, <i>s</i> is a
3162 reference, and references can't be null. </p>
3163 <p><b>Proposed resolution:</b></p>
3164 <p>In 24.5.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.ostreambuf.iter.cons"> [lib.ostreambuf.iter.cons]</a>:</p>
3166 <p>Move the current paragraph 1, which reads "Requires: s is not
3167 null.", from the first constructor to the second constructor.</p>
3169 <p>Insert a new paragraph 1 Requires clause for the first constructor
3170 reading:</p>
3172 <blockquote>
3173 <p><b>Requires</b>: <tt>s.rdbuf()</tt> is not null.</p>
3174 </blockquote>
3175 <hr>
3176 <a name="114"><h3>114.&nbsp;Placement forms example in error twice</h3></a><p><b>Section:</b>&nbsp;18.4.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.placement"> [lib.new.delete.placement]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;28 Oct 1998</p>
3177 <p>Section 18.4.1.3 contains the following example: </p>
3179 <pre>[Example: This can be useful for constructing an object at a known address:
3180 char place[sizeof(Something)];
3181 Something* p = new (place) Something();
3182 -end example]</pre>
3184 <p>First code line: "place" need not have any special alignment, and the
3185 following constructor could fail due to misaligned data.</p>
3187 <p>Second code line: Aren't the parens on Something() incorrect?&nbsp; [Dublin: the LWG
3188 believes the () are correct.]</p>
3190 <p>Examples are not normative, but nevertheless should not show code that is invalid or
3191 likely to fail.</p>
3192 <p><b>Proposed resolution:</b></p>
3193 <p>Replace the <u> first line of code</u> in the example in
3194 18.4.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.placement"> [lib.new.delete.placement]</a> with:
3195 </p>
3197 <blockquote>
3198 <pre>void* place = operator new(sizeof(Something));</pre>
3199 </blockquote>
3200 <hr>
3201 <a name="115"><h3>115.&nbsp;Typo in strstream constructors</h3></a><p><b>Section:</b>&nbsp;D.7.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstream.cons"> [depr.strstream.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;2 Nov 1998</p>
3202 <p>D.7.4.1 strstream constructors paragraph 2 says: </p>
3204 <blockquote>
3205 <p>Effects: Constructs an object of class strstream, initializing the base class with
3206 iostream(&amp; sb) and initializing sb with one of the two constructors: </p>
3207 <p>- If mode&amp;app==0, then s shall designate the first element of an array of n
3208 elements. The constructor is strstreambuf(s, n, s). </p>
3209 <p>- If mode&amp;app==0, then s shall designate the first element of an array of n
3210 elements that contains an NTBS whose first element is designated by s. The constructor is
3211 strstreambuf(s, n, s+std::strlen(s)).</p>
3212 </blockquote>
3214 <p>Notice the second condition is the same as the first. I think the second condition
3215 should be "If mode&amp;app==app", or "mode&amp;app!=0", meaning that
3216 the append bit is set.</p>
3217 <p><b>Proposed resolution:</b></p>
3218 <p>In D.7.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ostrstream.cons"> [depr.ostrstream.cons]</a> paragraph 2 and D.7.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.strstream.cons"> [depr.strstream.cons]</a>
3219 paragraph 2, change the first condition to <tt>(mode&amp;app)==0</tt>
3220 and the second condition to <tt>(mode&amp;app)!=0</tt>.</p>
3221 <hr>
3222 <a name="117"><h3>117.&nbsp;<tt>basic_ostream</tt> uses nonexistent <tt>num_put</tt> member functions</h3></a><p><b>Section:</b>&nbsp;27.6.2.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.arithmetic"> [lib.ostream.inserters.arithmetic]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;20 Nov 1998</p>
3223 <p>The <b>effects</b> clause for numeric inserters says that
3224 insertion of a value <tt>x</tt>, whose type is either <tt>bool</tt>,
3225 <tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>, <tt>unsigned
3226 int</tt>, <tt>long</tt>, <tt>unsigned long</tt>, <tt>float</tt>,
3227 <tt>double</tt>, <tt>long double</tt>, or <tt>const void*</tt>, is
3228 delegated to <tt>num_put</tt>, and that insertion is performed as if
3229 through the following code fragment: </p>
3231 <pre>bool failed = use_facet&lt;
3232 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3233 &gt;(getloc()).put(*this, *this, fill(), val). failed();</pre>
3235 <p>This doesn't work, because <tt>num_put&lt;&gt;</tt>::put is only
3236 overloaded for the types <tt>bool</tt>, <tt>long</tt>, <tt>unsigned
3237 long</tt>, <tt>double</tt>, <tt>long double</tt>, and <tt>const
3238 void*</tt>. That is, the code fragment in the standard is incorrect
3239 (it is diagnosed as ambiguous at compile time) for the types
3240 <tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>, <tt>unsigned
3241 int</tt>, and <tt>float</tt>. </p>
3243 <p>We must either add new member functions to <tt>num_put</tt>, or
3244 else change the description in <tt>ostream</tt> so that it only calls
3245 functions that are actually there. I prefer the latter. </p>
3246 <p><b>Proposed resolution:</b></p>
3247 <p>Replace 27.6.2.5.2, paragraph 1 with the following: </p>
3249 <blockquote>
3251 The classes num_get&lt;&gt; and num_put&lt;&gt; handle locale­dependent numeric
3252 formatting and parsing. These inserter functions use the imbued
3253 locale value to perform numeric formatting. When val is of type bool,
3254 long, unsigned long, double, long double, or const void*, the
3255 formatting conversion occurs as if it performed the following code
3256 fragment:
3257 </p>
3259 <pre>bool failed = use_facet&lt;
3260 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3261 &gt;(getloc()).put(*this, *this, fill(), val). failed();
3262 </pre>
3265 When val is of type short the formatting conversion occurs as if it
3266 performed the following code fragment:
3267 </p>
3269 <pre>ios_base::fmtflags baseflags = ios_base::flags() &amp; ios_base::basefield;
3270 bool failed = use_facet&lt;
3271 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3272 &gt;(getloc()).put(*this, *this, fill(),
3273 baseflags == ios_base::oct || baseflags == ios_base::hex
3274 ? static_cast&lt;long&gt;(static_cast&lt;unsigned short&gt;(val))
3275 : static_cast&lt;long&gt;(val)). failed();
3276 </pre>
3279 When val is of type int the formatting conversion occurs as if it performed
3280 the following code fragment:
3281 </p>
3283 <pre>ios_base::fmtflags baseflags = ios_base::flags() &amp; ios_base::basefield;
3284 bool failed = use_facet&lt;
3285 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3286 &gt;(getloc()).put(*this, *this, fill(),
3287 baseflags == ios_base::oct || baseflags == ios_base::hex
3288 ? static_cast&lt;long&gt;(static_cast&lt;unsigned int&gt;(val))
3289 : static_cast&lt;long&gt;(val)). failed();
3290 </pre>
3293 When val is of type unsigned short or unsigned int the formatting conversion
3294 occurs as if it performed the following code fragment:
3295 </p>
3297 <pre>bool failed = use_facet&lt;
3298 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3299 &gt;(getloc()).put(*this, *this, fill(), static_cast&lt;unsigned long&gt;(val)).
3300 failed();
3301 </pre>
3304 When val is of type float the formatting conversion occurs as if it
3305 performed the following code fragment:
3306 </p>
3308 <pre>bool failed = use_facet&lt;
3309 num_put&lt;charT,ostreambuf_iterator&lt;charT,traits&gt; &gt;
3310 &gt;(getloc()).put(*this, *this, fill(), static_cast&lt;double&gt;(val)).
3311 failed();
3312 </pre>
3314 </blockquote>
3316 <p><i>[post-Toronto: This differs from the previous proposed
3317 resolution; PJP provided the new wording. The differences are in
3318 signed short and int output.]</i></p>
3319 <p><b>Rationale:</b></p>
3320 <p>The original proposed resolution was to cast int and short to long,
3321 unsigned int and unsigned short to unsigned long, and float to double,
3322 thus ensuring that we don't try to use nonexistent num_put&lt;&gt;
3323 member functions. The current proposed resolution is more
3324 complicated, but gives more expected results for hex and octal output
3325 of signed short and signed int. (On a system with 16-bit short, for
3326 example, printing short(-1) in hex format should yield 0xffff.)</p>
3327 <hr>
3328 <a name="118"><h3>118.&nbsp;<tt>basic_istream</tt> uses nonexistent <tt>num_get</tt> member functions</h3></a><p><b>Section:</b>&nbsp;27.6.1.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.arithmetic"> [lib.istream.formatted.arithmetic]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;20 Nov 1998</p>
3329 <p>Formatted input is defined for the types <tt>short</tt>, <tt>unsigned short</tt>, <tt>int</tt>,
3330 <tt>unsigned int</tt>, <tt>long</tt>, <tt>unsigned long</tt>, <tt>float</tt>, <tt>double</tt>,
3331 <tt>long double</tt>, <tt>bool</tt>, and <tt>void*</tt>. According to section 27.6.1.2.2,
3332 formatted input of a value <tt>x</tt> is done as if by the following code fragment: </p>
3334 <pre>typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
3335 iostate err = 0;
3336 use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, val);
3337 setstate(err);</pre>
3339 <p>According to section 22.2.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.members"> [lib.facet.num.get.members]</a>, however,
3340 <tt>num_get&lt;&gt;::get()</tt> is only overloaded for the types
3341 <tt>bool</tt>, <tt>long</tt>, <tt>unsigned short</tt>, <tt>unsigned
3342 int</tt>, <tt>unsigned long</tt>, <tt>unsigned long</tt>,
3343 <tt>float</tt>, <tt>double</tt>, <tt>long double</tt>, and
3344 <tt>void*</tt>. Comparing the lists from the two sections, we find
3345 that 27.6.1.2.2 is using a nonexistent function for types
3346 <tt>short</tt> and <tt>int</tt>. </p>
3347 <p><b>Proposed resolution:</b></p>
3348 <p>In 27.6.1.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.arithmetic"> [lib.istream.formatted.arithmetic]</a> Arithmetic Extractors, remove the
3349 two lines (1st and 3rd) which read:</p>
3350 <blockquote>
3351 <pre>operator&gt;&gt;(short&amp; val);
3353 operator&gt;&gt;(int&amp; val);</pre>
3354 </blockquote>
3356 <p>And add the following at the end of that section (27.6.1.2.2) :</p>
3358 <blockquote>
3359 <pre>operator&gt;&gt;(short&amp; val);</pre>
3360 <p>The conversion occurs as if performed by the following code fragment (using
3361 the same notation as for the preceding code fragment):</p>
3362 <pre> typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
3363 iostate err = 0;
3364 long lval;
3365 use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, lval);
3366 if (err == 0
3367 &amp;&amp; (lval &lt; numeric_limits&lt;short&gt;::min() || numeric_limits&lt;short&gt;::max() &lt; lval))
3368 err = ios_base::failbit;
3369 setstate(err);</pre>
3370 <pre>operator&gt;&gt;(int&amp; val);</pre>
3371 <p>The conversion occurs as if performed by the following code fragment (using
3372 the same notation as for the preceding code fragment):</p>
3373 <pre> typedef num_get&lt; charT,istreambuf_iterator&lt;charT,traits&gt; &gt; numget;
3374 iostate err = 0;
3375 long lval;
3376 use_facet&lt; numget &gt;(loc).get(*this, 0, *this, err, lval);
3377 if (err == 0
3378 &amp;&amp; (lval &lt; numeric_limits&lt;int&gt;::min() || numeric_limits&lt;int&gt;::max() &lt; lval))
3379 err = ios_base::failbit;
3380 setstate(err);</pre>
3381 </blockquote>
3383 <p><i>[Post-Tokyo: PJP provided the above wording.]</i></p>
3384 <hr>
3385 <a name="119"><h3>119.&nbsp;Should virtual functions be allowed to strengthen the exception specification?</h3></a><p><b>Section:</b>&nbsp;17.4.4.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.exception.handling"> [lib.res.on.exception.handling]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3386 <p>Section 17.4.4.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.exception.handling"> [lib.res.on.exception.handling]</a> states: </p>
3388 <p>"An implementation may strengthen the exception-specification
3389 for a function by removing listed exceptions." </p>
3391 <p>The problem is that if an implementation is allowed to do this for
3392 virtual functions, then a library user cannot write a class that
3393 portably derives from that class. </p>
3395 <p>For example, this would not compile if ios_base::failure::~failure
3396 had an empty exception specification: </p>
3398 <pre>#include &lt;ios&gt;
3399 #include &lt;string&gt;
3401 class D : public std::ios_base::failure {
3402 public:
3403 D(const std::string&amp;);
3404 ~D(); // error - exception specification must be compatible with
3405 // overridden virtual function ios_base::failure::~failure()
3406 };</pre>
3407 <p><b>Proposed resolution:</b></p>
3408 <p>Change Section 17.4.4.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.exception.handling"> [lib.res.on.exception.handling]</a> from:</p>
3410 <p>&nbsp;&nbsp;&nbsp;&nbsp; "may strengthen the
3411 exception-specification for a function"</p>
3413 <p>to:</p>
3415 <p>&nbsp;&nbsp;&nbsp;&nbsp; "may strengthen the
3416 exception-specification for a non-virtual function". </p>
3417 <hr>
3418 <a name="120"><h3>120.&nbsp;Can an implementor add specializations?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3420 <p>The original issue asked whether a library implementor could
3421 specialize standard library templates for built-in types. (This was
3422 an issue because users are permitted to explicitly instantiate
3423 standard library templates.)</p>
3425 <p>Specializations are no longer a problem, because of the resolution
3426 to core issue 259. Under the proposed resolution, it will be legal
3427 for a translation unit to contain both a specialization and an
3428 explicit instantiation of the same template, provided that the
3429 specialization comes first. In such a case, the explicit
3430 instantiation will be ignored. Further discussion of library issue
3431 120 assumes that the core 259 resolution will be adopted.</p>
3433 <p>However, as noted in lib-7047, one piece of this issue still
3434 remains: what happens if a standard library implementor explicitly
3435 instantiates a standard library templates? It's illegal for a program
3436 to contain two different explicit instantiations of the same template
3437 for the same type in two different translation units (ODR violation),
3438 and the core working group doesn't believe it is practical to relax
3439 that restriction.</p>
3441 <p>The issue, then, is: are users allowed to explicitly instantiate
3442 standard library templates for non-user defined types? The status quo
3443 answer is 'yes'. Changing it to 'no' would give library implementors
3444 more freedom.</p>
3446 <p>This is an issue because, for performance reasons, library
3447 implementors often need to explicitly instantiate standard library
3448 templates. (for example, std::basic_string&lt;char&gt;) Does giving
3449 users freedom to explicitly instantiate standard library templates for
3450 non-user defined types make it impossible or painfully difficult for
3451 library implementors to do this?</p>
3453 <p>John Spicer suggests, in lib-8957, that library implementors have a
3454 mechanism they can use for explicit instantiations that doesn't
3455 prevent users from performing their own explicit instantiations: put
3456 each explicit instantiation in its own object file. (Different
3457 solutions might be necessary for Unix DSOs or MS-Windows DLLs.) On
3458 some platforms, library implementors might not need to do anything
3459 special: the "undefined behavior" that results from having two
3460 different explicit instantiations might be harmless.</p>
3462 <p><b>Proposed resolution:</b></p>
3463 <p>Append to 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> paragraph 1: </p>
3464 <blockquote>
3465 A program may explicitly instantiate any templates in the standard
3466 library only if the declaration depends on the name of a user-defined
3467 type of external linkage and the instantiation meets the standard library
3468 requirements for the original template.
3469 </blockquote>
3471 <p><i>[Kona: changed the wording from "a user-defined name" to "the name of
3472 a user-defined type"]</i></p>
3474 <p><b>Rationale:</b></p>
3475 <p>The LWG considered another possible resolution:</p>
3476 <blockquote>
3477 <p>In light of the resolution to core issue 259, no normative changes
3478 in the library clauses are necessary. Add the following non-normative
3479 note to the end 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> paragraph 1:</p>
3480 <blockquote>
3481 [<i>Note:</i> A program may explicitly instantiate standard library
3482 templates, even when an explicit instantiation does not depend on
3483 a user-defined name. <i>--end note</i>]
3484 </blockquote>
3485 </blockquote>
3487 <p>The LWG rejected this because it was believed that it would make
3488 it unnecessarily difficult for library implementors to write
3489 high-quality implementations. A program may not include an
3490 explicit instantiation of the same template, for the same template
3491 arguments, in two different translation units. If users are
3492 allowed to provide explicit instantiations of Standard Library
3493 templates for built-in types, then library implementors aren't,
3494 at least not without nonportable tricks.</p>
3496 <p>The most serious problem is a class template that has writeable
3497 static member variables. Unfortunately, such class templates are
3498 important and, in existing Standard Library implementations, are
3499 often explicitly specialized by library implementors: locale facets,
3500 which have a writeable static member variable <tt>id</tt>. If a
3501 user's explicit instantiation collided with the implementations
3502 explicit instantiation, iostream initialization could cause locales
3503 to be constructed in an inconsistent state.</p>
3505 <p>One proposed implementation technique was for Standard Library
3506 implementors to provide explicit instantiations in separate object
3507 files, so that they would not be picked up by the linker when the
3508 user also provides an explicit instantiation. However, this
3509 technique only applies for Standard Library implementations that
3510 are packaged as static archives. Most Standard Library
3511 implementations nowadays are packaged as dynamic libraries, so this
3512 technique would not apply.</p>
3514 <p>The Committee is now considering standardization of dynamic
3515 linking. If there are such changes in the future, it may be
3516 appropriate to revisit this issue later.</p>
3517 <hr>
3518 <a name="122"><h3>122.&nbsp;streambuf/wstreambuf description should not say they are specializations</h3></a><p><b>Section:</b>&nbsp;27.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf"> [lib.streambuf]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3519 <p>Section 27.5.2 describes the streambuf classes this way: </p>
3521 <blockquote>
3523 <p>The class streambuf is a specialization of the template class basic_streambuf
3524 specialized for the type char. </p>
3526 <p>The class wstreambuf is a specialization of the template class basic_streambuf
3527 specialized for the type wchar_t. </p>
3529 </blockquote>
3531 <p>This implies that these classes must be template specializations, not typedefs. </p>
3533 <p>It doesn't seem this was intended, since Section 27.5 has them declared as typedefs. </p>
3534 <p><b>Proposed resolution:</b></p>
3535 <p>Remove 27.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf"> [lib.streambuf]</a> paragraphs 2 and 3 (the above two
3536 sentences). </p>
3537 <p><b>Rationale:</b></p>
3538 <p>The <tt>streambuf</tt> synopsis already has a declaration for the
3539 typedefs and that is sufficient. </p>
3540 <hr>
3541 <a name="123"><h3>123.&nbsp;Should valarray helper arrays fill functions be const?</h3></a><p><b>Section:</b>&nbsp;26.3.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.fill"> [lib.slice.arr.fill]</a>, 26.3.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.fill"> [lib.gslice.array.fill]</a>, 26.3.8.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.fill"> [lib.mask.array.fill]</a>, 26.3.9.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.fill"> [lib.indirect.array.fill]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998 </p>
3542 <p>One of the operator= in the valarray helper arrays is const and one
3543 is not. For example, look at slice_array. This operator= in Section
3544 26.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.assign"> [lib.slice.arr.assign]</a> is const: </p>
3546 <p>&nbsp;&nbsp;&nbsp; <tt>void operator=(const valarray&lt;T&gt;&amp;) const;</tt> </p>
3548 <p>but this one in Section 26.3.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.fill"> [lib.slice.arr.fill]</a> is not: </p>
3550 <p>&nbsp;&nbsp;&nbsp; <tt>void operator=(const T&amp;); </tt></p>
3552 <p>The description of the semantics for these two functions is similar. </p>
3553 <p><b>Proposed resolution:</b></p>
3555 <p>26.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.slice.array"> [lib.template.slice.array]</a> Template class slice_array</p>
3556 <blockquote>
3558 <p>In the class template definition for slice_array, replace the member
3559 function declaration</p>
3560 <pre> void operator=(const T&amp;);
3561 </pre>
3562 <p>with</p>
3563 <pre> void operator=(const T&amp;) const;
3564 </pre>
3565 </blockquote>
3567 <p>26.3.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.fill"> [lib.slice.arr.fill]</a> slice_array fill function</p>
3568 <blockquote>
3570 <p>Change the function declaration</p>
3571 <pre> void operator=(const T&amp;);
3572 </pre>
3573 <p>to</p>
3574 <pre> void operator=(const T&amp;) const;
3575 </pre>
3576 </blockquote>
3578 <p>26.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.gslice.array"> [lib.template.gslice.array]</a> Template class gslice_array</p>
3579 <blockquote>
3581 <p>In the class template definition for gslice_array, replace the member
3582 function declaration</p>
3583 <pre> void operator=(const T&amp;);
3584 </pre>
3585 <p>with</p>
3586 <pre> void operator=(const T&amp;) const;
3587 </pre>
3588 </blockquote>
3590 <p>26.3.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.fill"> [lib.gslice.array.fill]</a> gslice_array fill function</p>
3591 <blockquote>
3593 <p>Change the function declaration</p>
3594 <pre> void operator=(const T&amp;);
3595 </pre>
3596 <p>to</p>
3597 <pre> void operator=(const T&amp;) const;
3598 </pre>
3599 </blockquote>
3601 <p>26.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.mask.array"> [lib.template.mask.array]</a> Template class mask_array</p>
3602 <blockquote>
3604 <p>In the class template definition for mask_array, replace the member
3605 function declaration</p>
3606 <pre> void operator=(const T&amp;);
3607 </pre>
3608 <p>with</p>
3609 <pre> void operator=(const T&amp;) const;
3610 </pre>
3611 </blockquote>
3613 <p>26.3.8.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.fill"> [lib.mask.array.fill]</a> mask_array fill function</p>
3614 <blockquote>
3616 <p>Change the function declaration</p>
3617 <pre> void operator=(const T&amp;);
3618 </pre>
3619 <p>to</p>
3620 <pre> void operator=(const T&amp;) const;
3621 </pre>
3622 </blockquote>
3624 <p>26.3.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.indirect.array"> [lib.template.indirect.array]</a> Template class indirect_array</p>
3625 <blockquote>
3627 <p>In the class template definition for indirect_array, replace the member
3628 function declaration</p>
3629 <pre> void operator=(const T&amp;);
3630 </pre>
3631 <p>with</p>
3632 <pre> void operator=(const T&amp;) const;
3633 </pre>
3634 </blockquote>
3636 <p>26.3.9.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.fill"> [lib.indirect.array.fill]</a> indirect_array fill function</p>
3637 <blockquote>
3639 <p>Change the function declaration</p>
3640 <pre> void operator=(const T&amp;);
3641 </pre>
3642 <p>to</p>
3643 <pre> void operator=(const T&amp;) const;
3644 </pre>
3645 </blockquote>
3648 <p><i>[Redmond: Robert provided wording.]</i></p>
3650 <p><b>Rationale:</b></p>
3651 <p>There's no good reason for one version of operator= being const and
3652 another one not. Because of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#253">253</a>, this now
3653 matters: these functions are now callable in more circumstances. In
3654 many existing implementations, both versions are already const.</p>
3655 <hr>
3656 <a name="124"><h3>124.&nbsp;ctype_byname&lt;charT&gt;::do_scan_is &amp; do_scan_not return type should be const charT*</h3></a><p><b>Section:</b>&nbsp;22.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname"> [lib.locale.ctype.byname]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3657 <p>In Section 22.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname"> [lib.locale.ctype.byname]</a>
3658 ctype_byname&lt;charT&gt;::do_scan_is() and do_scan_not() are declared
3659 to return a const char* not a const charT*. </p>
3660 <p><b>Proposed resolution:</b></p>
3661 <p>Change Section 22.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname"> [lib.locale.ctype.byname]</a> <tt>do_scan_is()</tt> and
3662 <tt>do_scan_not()</tt> to return a <tt> const
3663 charT*</tt>. </p>
3664 <hr>
3665 <a name="125"></a><h3><a name="125">125.&nbsp;valarray&lt;T&gt;::operator!() return type is inconsistent</a></h3><p><b>Section:</b>&nbsp;26.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.valarray"> [lib.template.valarray]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3666 <p>In Section 26.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.valarray"> [lib.template.valarray]</a> valarray&lt;T&gt;::operator!() is
3667 declared to return a valarray&lt;T&gt;, but in Section 26.3.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.unary"> [lib.valarray.unary]</a> it is declared to return a valarray&lt;bool&gt;. The
3668 latter appears to be correct. </p>
3669 <p><b>Proposed resolution:</b></p>
3670 <p>Change in Section 26.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.valarray"> [lib.template.valarray]</a> the declaration of
3671 <tt>operator!()</tt> so that the return type is
3672 <tt>valarray&lt;bool&gt;</tt>. </p>
3673 <hr>
3674 <a name="126"><h3>126.&nbsp;typos in Effects clause of ctype::do_narrow()</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;15 Dec 1998</p>
3675 <p>Typos in 22.2.1.1.2 need to be fixed.</p>
3676 <p><b>Proposed resolution:</b></p>
3677 <p>In Section 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> change: </p>
3679 <pre> do_widen(do_narrow(c),0) == c</pre>
3681 <p>to:</p>
3683 <pre> do_widen(do_narrow(c,0)) == c</pre>
3685 <p>and change:</p>
3687 <pre> (is(M,c) || !ctc.is(M, do_narrow(c),dfault) )</pre>
3689 <p>to:</p>
3691 <pre> (is(M,c) || !ctc.is(M, do_narrow(c,dfault)) )</pre>
3692 <hr>
3693 <a name="127"><h3>127.&nbsp;auto_ptr&lt;&gt; conversion 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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Greg Colvin&nbsp; <b>Date:</b>&nbsp;17 Feb 1999</p>
3694 <p>There are two problems with the current <tt>auto_ptr</tt> wording
3695 in the standard: </p>
3697 <p>First, the <tt>auto_ptr_ref</tt> definition cannot be nested
3698 because <tt>auto_ptr&lt;Derived&gt;::auto_ptr_ref</tt> is unrelated to
3699 <tt>auto_ptr&lt;Base&gt;::auto_ptr_ref</tt>. <i>Also submitted by
3700 Nathan Myers, with the same proposed resolution.</i></p>
3702 <p>Second, there is no <tt>auto_ptr</tt> assignment operator taking an
3703 <tt>auto_ptr_ref</tt> argument. </p>
3705 <p>I have discussed these problems with my proposal coauthor, Bill
3706 Gibbons, and with some compiler and library implementors, and we
3707 believe that these problems are not desired or desirable implications
3708 of the standard. </p>
3710 <p>25 Aug 1999: The proposed resolution now reflects changes suggested
3711 by Dave Abrahams, with Greg Colvin's concurrence; 1) changed
3712 "assignment operator" to "public assignment
3713 operator", 2) changed effects to specify use of release(), 3)
3714 made the conversion to auto_ptr_ref const. </p>
3716 <p>2 Feb 2000: Lisa Lippincott comments: [The resolution of] this issue
3717 states that the conversion from auto_ptr to auto_ptr_ref should
3718 be const. This is not acceptable, because it would allow
3719 initialization and assignment from _any_ const auto_ptr! It also
3720 introduces an implementation difficulty in writing this conversion
3721 function -- namely, somewhere along the line, a const_cast will be
3722 necessary to remove that const so that release() may be called. This
3723 may result in undefined behavior [7.1.5.1/4]. The conversion
3724 operator does not have to be const, because a non-const implicit
3725 object parameter may be bound to an rvalue [13.3.3.1.4/3]
3726 [13.3.1/5]. </p>
3728 <p>Tokyo: The LWG removed the following from the proposed resolution:</p>
3730 <p>In 20.4.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr"> [lib.auto.ptr]</a>, paragraph 2, and 20.4.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr.conv"> [lib.auto.ptr.conv]</a>,
3731 paragraph 2, make the conversion to auto_ptr_ref const:</p>
3732 <blockquote>
3733 <pre>template&lt;class Y&gt; operator auto_ptr_ref&lt;Y&gt;() const throw();</pre>
3734 </blockquote>
3735 <p><b>Proposed resolution:</b></p>
3736 <p>In 20.4.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr"> [lib.auto.ptr]</a>, paragraph 2, move
3737 the <tt>auto_ptr_ref</tt> definition to namespace scope.</p>
3739 <p>In 20.4.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr"> [lib.auto.ptr]</a>, paragraph 2, add
3740 a public assignment operator to the <tt>auto_ptr</tt> definition: </p>
3742 <blockquote>
3743 <pre>auto_ptr&amp; operator=(auto_ptr_ref&lt;X&gt; r) throw();</pre>
3744 </blockquote>
3746 <p>Also add the assignment operator to 20.4.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.auto.ptr.conv"> [lib.auto.ptr.conv]</a>: </p>
3748 <blockquote>
3749 <pre>auto_ptr&amp; operator=(auto_ptr_ref&lt;X&gt; r) throw()</pre>
3751 <b>Effects:</b> Calls <tt>reset(p.release())</tt> for the <tt>auto_ptr
3752 p</tt> that <tt>r</tt> holds a reference to.<br>
3753 <b>Returns: </b><tt>*this</tt>.
3755 </blockquote>
3756 <hr>
3757 <a name="129"><h3>129.&nbsp;Need error indication from seekp() and seekg()</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>, 27.6.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.seeks"> [lib.ostream.seeks]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;22 Feb 1999</p>
3758 <p>Currently, the standard does not specify how seekg() and seekp()
3759 indicate failure. They are not required to set failbit, and they can't
3760 return an error indication because they must return *this, i.e. the
3761 stream. Hence, it is undefined what happens if they fail. And they
3762 <i>can</i> fail, for instance, when a file stream is disconnected from the
3763 underlying file (is_open()==false) or when a wide character file
3764 stream must perform a state-dependent code conversion, etc. </p>
3766 <p>The stream functions seekg() and seekp() should set failbit in the
3767 stream state in case of failure.</p>
3768 <p><b>Proposed resolution:</b></p>
3769 <p>Add to the Effects: clause of&nbsp; seekg() in
3770 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> and to the Effects: clause of seekp() in
3771 27.6.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.seeks"> [lib.ostream.seeks]</a>: </p>
3773 <blockquote>
3774 <p>In case of failure, the function calls <tt>setstate(failbit)</tt> (which may throw <tt>ios_base::failure</tt>).
3775 </p>
3776 </blockquote>
3777 <p><b>Rationale:</b></p>
3778 <p>Setting failbit is the usual error reporting mechanism for streams</p>
3779 <hr>
3780 <a name="130"><h3>130.&nbsp;Return type of container::erase(iterator) differs for associative containers</h3></a><p><b>Section:</b>&nbsp;23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a>, 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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;2 Mar 1999</p>
3781 <p>Table 67 (23.1.1) says that container::erase(iterator) returns an
3782 iterator. Table 69 (23.1.2) says that in addition to this requirement,
3783 associative containers also say that container::erase(iterator)
3784 returns void. That's not an addition; it's a change to the
3785 requirements, which has the effect of making associative containers
3786 fail to meet the requirements for containers.</p>
3787 <p><b>Proposed resolution:</b></p>
3790 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 Table 69 Associative container
3791 requirements, change the return type of <tt>a.erase(q)</tt> from
3792 <tt>void</tt> to <tt>iterator</tt>. Change the
3793 assertion/not/pre/post-condition from "erases the element pointed to
3794 by <tt>q</tt>" to "erases the element pointed to by <tt>q</tt>.
3795 Returns an iterator pointing to the element immediately following q
3796 prior to the element being erased. If no such element exists, a.end()
3797 is returned."
3798 </p>
3801 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 Table 69 Associative container
3802 requirements, change the return type of <tt>a.erase(q1, q2)</tt>
3803 from <tt>void</tt> to <tt>iterator</tt>. Change the
3804 assertion/not/pre/post-condition from "erases the elements in the
3805 range <tt>[q1, q2)</tt>" to "erases the elements in the range <tt>[q1,
3806 q2)</tt>. Returns q2."
3807 </p>
3810 In 23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>, in the <tt>map</tt> class synopsis; and
3811 in 23.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.multimap"> [lib.multimap]</a>, in the <tt>multimap</tt> class synopsis; and
3812 in 23.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.set"> [lib.set]</a>, in the <tt>set</tt> class synopsis; and
3813 in 23.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.multiset"> [lib.multiset]</a>, in the <tt>multiset</tt> class synopsis:
3814 change the signature of the first <tt>erase</tt> overload to
3815 </p>
3816 <pre> iterator erase(iterator position);
3817 </pre>
3818 <p>and change the signature of the third <tt>erase</tt> overload to</p>
3819 <pre> iterator erase(iterator first, iterator last);
3820 </pre>
3823 <p><i>[Pre-Kona: reopened at the request of Howard Hinnant]</i></p>
3825 <p><i>[Post-Kona: the LWG agrees the return type should be
3826 <tt>iterator</tt>, not <tt>void</tt>. (Alex Stepanov agrees too.)
3827 Matt provided wording.]</i></p>
3829 <p><i>[
3830 Sydney: the proposed wording went in the right direction, but it
3831 wasn't good enough. We want to return an iterator from the range form
3832 of erase as well as the single-iterator form. Also, the wording is
3833 slightly different from the wording we have for sequences; there's no
3834 good reason for having a difference. Matt provided new wording,
3835 which we will review at the next meeting.
3836 ]</i></p>
3838 <hr>
3839 <a name="132"><h3>132.&nbsp;list::resize description uses random access iterators</h3></a><p><b>Section:</b>&nbsp;23.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.capacity"> [lib.list.capacity]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;6 Mar 1999</p>
3840 <p>The description reads:</p>
3842 <p>-1- Effects:</p>
3844 <pre> if (sz &gt; size())
3845 insert(end(), sz-size(), c);
3846 else if (sz &lt; size())
3847 erase(begin()+sz, end());
3848 else
3849 ; // do nothing</pre>
3851 <p>Obviously list::resize should not be specified in terms of random access iterators.</p>
3852 <p><b>Proposed resolution:</b></p>
3853 <p>Change 23.2.2.2 paragraph 1 to:</p>
3855 <p>Effects:</p>
3857 <pre> if (sz &gt; size())
3858 insert(end(), sz-size(), c);
3859 else if (sz &lt; size())
3861 iterator i = begin();
3862 advance(i, sz);
3863 erase(i, end());
3864 }</pre>
3866 <p><i>[Dublin: The LWG asked Howard to discuss exception safety offline
3867 with David Abrahams. They had a discussion and believe there is
3868 no issue of exception safety with the proposed resolution.]</i></p>
3869 <hr>
3870 <a name="133"><h3>133.&nbsp;map missing get_allocator()</h3></a><p><b>Section:</b>&nbsp;23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;6 Mar 1999</p>
3871 <p>The title says it all.</p>
3872 <p><b>Proposed resolution:</b></p>
3873 <p>Insert in 23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>, paragraph 2,
3874 after operator= in the map declaration:</p>
3876 <pre> allocator_type get_allocator() const;</pre>
3877 <hr>
3878 <a name="134"><h3>134.&nbsp;vector constructors over specified</h3></a><p><b>Section:</b>&nbsp;23.2.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.cons"> [lib.vector.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;6 Mar 1999</p>
3879 <p>The complexity description says: "It does at most 2N calls to the copy constructor
3880 of T and logN reallocations if they are just input iterators ...".</p>
3882 <p>This appears to be overly restrictive, dictating the precise memory/performance
3883 tradeoff for the implementor.</p>
3884 <p><b>Proposed resolution:</b></p>
3885 <p>Change 23.2.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.cons"> [lib.vector.cons]</a>, paragraph 1 to:</p>
3887 <p>-1- Complexity: The constructor template &lt;class
3888 InputIterator&gt; vector(InputIterator first, InputIterator last)
3889 makes only N calls to the copy constructor of T (where N is the
3890 distance between first and last) and no reallocations if iterators
3891 first and last are of forward, bidirectional, or random access
3892 categories. It makes order N calls to the copy constructor of T and
3893 order logN reallocations if they are just input iterators.
3894 </p>
3895 <p><b>Rationale:</b></p>
3896 <p>"at most 2N calls" is correct only if the growth factor
3897 is greater than or equal to 2.
3898 </p>
3899 <hr>
3900 <a name="136"><h3>136.&nbsp;seekp, seekg setting wrong streams?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;6 Mar 1999</p>
3901 <p>I may be misunderstanding the intent, but should not seekg set only
3902 the input stream and seekp set only the output stream? The description
3903 seems to say that each should set both input and output streams. If
3904 that's really the intent, I withdraw this proposal.</p>
3905 <p><b>Proposed resolution:</b></p>
3906 <p>In section 27.6.1.3 change:</p>
3908 <pre>basic_istream&lt;charT,traits&gt;&amp; seekg(pos_type pos);
3909 Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos). </pre>
3911 <p>To:</p>
3913 <pre>basic_istream&lt;charT,traits&gt;&amp; seekg(pos_type pos);
3914 Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos, ios_base::in). </pre>
3916 <p>In section 27.6.1.3 change:</p>
3918 <pre>basic_istream&lt;charT,traits&gt;&amp; seekg(off_type&amp; off, ios_base::seekdir dir);
3919 Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir). </pre>
3921 <p>To:</p>
3923 <pre>basic_istream&lt;charT,traits&gt;&amp; seekg(off_type&amp; off, ios_base::seekdir dir);
3924 Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir, ios_base::in). </pre>
3926 <p>In section 27.6.2.4, paragraph 2 change:</p>
3928 <pre>-2- Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos). </pre>
3930 <p>To:</p>
3932 <pre>-2- Effects: If fail() != true, executes rdbuf()-&gt;pubseekpos(pos, ios_base::out). </pre>
3934 <p>In section 27.6.2.4, paragraph 4 change:</p>
3936 <pre>-4- Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir). </pre>
3938 <p>To:</p>
3940 <pre>-4- Effects: If fail() != true, executes rdbuf()-&gt;pubseekoff(off, dir, ios_base::out). </pre>
3942 <p><i>[Dublin: Dietmar Kühl thinks this is probably correct, but would
3943 like the opinion of more iostream experts before taking action.]</i></p>
3945 <p><i>[Tokyo: Reviewed by the LWG. PJP noted that although his docs are
3946 incorrect, his implementation already implements the Proposed
3947 Resolution.]</i></p>
3949 <p><i>[Post-Tokyo: Matt Austern comments:<br>
3950 Is it a problem with basic_istream and basic_ostream, or is it a problem
3951 with basic_stringbuf?
3952 We could resolve the issue either by changing basic_istream and
3953 basic_ostream, or by changing basic_stringbuf. I prefer the latter
3954 change (or maybe both changes): I don't see any reason for the standard to
3955 require that std::stringbuf s(std::string("foo"), std::ios_base::in);
3956 s.pubseekoff(0, std::ios_base::beg); must fail.<br>
3957 This requirement is a bit weird. There's no similar requirement
3958 for basic_streambuf&lt;&gt;::seekpos, or for basic_filebuf&lt;&gt;::seekoff or
3959 basic_filebuf&lt;&gt;::seekpos.]</i></p>
3960 <hr>
3961 <a name="137"><h3>137.&nbsp;Do use_facet and has_facet look in the global locale?</h3></a><p><b>Section:</b>&nbsp;22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;17 Mar 1999</p>
3962 <p>Section 22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a> says:</p>
3964 <p>-4- In the call to use_facet&lt;Facet&gt;(loc), the type argument
3965 chooses a facet, making available all members of the named type. If
3966 Facet is not present in a locale (or, failing that, in the global
3967 locale), it throws the standard exception bad_cast. A C++ program can
3968 check if a locale implements a particular facet with the template
3969 function has_facet&lt;Facet&gt;(). </p>
3971 <p>This contradicts the specification given in section
3972 22.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.global.templates"> [lib.locale.global.templates]</a>:
3973 <br><br>
3974 template &lt;class&nbsp; Facet&gt; const&nbsp; Facet&amp; use_facet(const
3975 locale&amp;&nbsp; loc); <br>
3976 <br>
3977 -1- Get a reference to a facet of a locale. <br>
3978 -2- Returns: a reference to the corresponding facet of loc, if present. <br>
3979 -3- Throws: bad_cast if has_facet&lt;Facet&gt;(loc) is false. <br>
3980 -4- Notes: The reference returned remains valid at least as long as any copy of loc exists
3981 </p>
3982 <p><b>Proposed resolution:</b></p>
3983 <p>Remove the phrase "(or, failing that, in the global locale)"
3984 from section 22.1.1. </p>
3985 <p><b>Rationale:</b></p>
3986 <p>Needed for consistency with the way locales are handled elsewhere
3987 in the standard.</p>
3988 <hr>
3989 <a name="139"><h3>139.&nbsp;Optional sequence operation table description unclear</h3></a><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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;30 Mar 1999</p>
3990 <p>The sentence introducing the Optional sequence operation table
3991 (23.1.1 paragraph 12) has two problems:</p>
3993 <p>A. It says ``The operations in table 68 are provided only for the containers for which
3994 they take constant time.''<br>
3995 <br>
3996 That could be interpreted in two ways, one of them being ``Even though table 68 shows
3997 particular operations as being provided, implementations are free to omit them if they
3998 cannot implement them in constant time.''<br>
3999 <br>
4000 B. That paragraph says nothing about amortized constant time, and it should.&nbsp;</p>
4001 <p><b>Proposed resolution:</b></p>
4002 <p>Replace the wording in 23.1.1 paragraph 12&nbsp; which begins ``The operations in table 68 are provided only..."
4003 with:</p>
4005 <blockquote>
4006 <p>Table 68 lists sequence operations that are provided for some types of sequential
4007 containers but not others. An implementation shall provide these operations for all
4008 container types shown in the ``container'' column, and shall implement them so as to take
4009 amortized constant time.</p>
4010 </blockquote>
4011 <hr>
4012 <a name="141"><h3>141.&nbsp;basic_string::find_last_of, find_last_not_of say pos instead of xpos</h3></a><p><b>Section:</b>&nbsp;21.3.6.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::find.last.of"> [lib.string::find.last.of]</a>, 21.3.6.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::find.last.not.of"> [lib.string::find.last.not.of]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Arch Robison&nbsp; <b>Date:</b>&nbsp;28 Apr 1999</p>
4013 <p>Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1 surely have misprints where they
4014 say:<br>
4015 <br>
4016 &#8212; <tt>xpos &lt;= pos</tt> and <tt>pos &lt; size();</tt></p>
4018 <p>Surely the document meant to say ``<tt>xpos &lt; size()</tt>'' in both places.</p>
4020 <p><i>[Judy Ward also sent in this issue for 21.3.6.4 with the same
4021 proposed resolution.]</i></p>
4022 <p><b>Proposed resolution:</b></p>
4023 <p>Change Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1, the line which says:<br>
4024 <br>
4025 &#8212; <tt>xpos &lt;= pos</tt> and <tt>pos &lt; size();<br>
4026 <br>
4027 </tt>to:<br>
4028 <tt><br>
4029 </tt>&#8212; <tt>xpos &lt;= pos</tt> and <tt>xpos &lt; size();</tt></p>
4030 <hr>
4031 <a name="142"><h3>142.&nbsp;lexicographical_compare complexity wrong</h3></a><p><b>Section:</b>&nbsp;25.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.lex.comparison"> [lib.alg.lex.comparison]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;20 Jun 1999</p>
4032 <p>The lexicographical_compare complexity is specified as:<br>
4033 <br>
4034 &nbsp;&nbsp;&nbsp;&nbsp; "At most min((last1 - first1), (last2 - first2))
4035 applications of the corresponding comparison."<br>
4036 <br>
4037 The best I can do is twice that expensive.</p>
4039 <p>Nicolai Josuttis comments in lib-6862: You mean, to check for
4040 equality you have to check both &lt; and &gt;? Yes, IMO you are
4041 right! (and Matt states this complexity in his book)</p>
4043 <p><b>Proposed resolution:</b></p>
4044 <p>Change 25.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.lex.comparison"> [lib.alg.lex.comparison]</a> complexity to:</p>
4045 <blockquote>
4046 At most <tt>2*min((last1 - first1), (last2 - first2))</tt>
4047 applications of the corresponding comparison.
4048 </blockquote>
4050 <p>Change the example at the end of paragraph 3 to read:</p>
4051 <blockquote>
4052 [Example:<br>
4053 <br>
4054 &nbsp;&nbsp;&nbsp; for ( ; first1 != last1 &amp;&amp; first2 != last2 ;
4055 ++first1, ++first2) {<br>
4056 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*first1 &lt; *first2) return true;<br>
4057 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*first2 &lt; *first1) return false;<br>
4058 &nbsp;&nbsp;&nbsp; }<br>
4059 &nbsp;&nbsp;&nbsp; return first1 == last1 &amp;&amp; first2 != last2;<br>
4060 &nbsp;&nbsp;&nbsp;<br>
4061 --end example]
4062 </blockquote>
4063 <hr>
4064 <a name="144"><h3>144.&nbsp;Deque constructor complexity wrong </h3></a><p><b>Section:</b>&nbsp;23.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.deque.cons"> [lib.deque.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Herb Sutter&nbsp; <b>Date:</b>&nbsp;9 May 1999</p>
4065 <p>In 23.2.1.1 paragraph 6, the deque ctor that takes an iterator range appears
4066 to have complexity requirements which are incorrect, and which contradict the
4067 complexity requirements for insert(). I suspect that the text in question,
4068 below, was taken from vector:</p>
4069 <blockquote>
4070 <p>Complexity: If the iterators first and last are forward iterators,
4071 bidirectional iterators, or random access iterators the constructor makes only
4072 N calls to the copy constructor, and performs no reallocations, where N is
4073 last - first.</p>
4074 </blockquote>
4075 <p>The word "reallocations" does not really apply to deque. Further,
4076 all of the following appears to be spurious:</p>
4077 <blockquote>
4078 <p>It makes at most 2N calls to the copy constructor of T and log N
4079 reallocations if they are input iterators.1)</p>
4080 <p>1) The complexity is greater in the case of input iterators because each
4081 element must be added individually: it is impossible to determine the distance
4082 between first abd last before doing the copying.</p>
4083 </blockquote>
4084 <p>This makes perfect sense for vector, but not for deque. Why should deque gain
4085 an efficiency advantage from knowing in advance the number of elements to
4086 insert?</p>
4087 <p><b>Proposed resolution:</b></p>
4088 <p>In 23.2.1.1 paragraph 6, replace the Complexity description, including the
4089 footnote, with the following text (which also corrects the "abd"
4090 typo):</p>
4091 <blockquote>
4092 <p>Complexity: Makes last - first calls to the copy constructor of T.</p>
4093 </blockquote>
4094 <hr>
4095 <a name="146"><h3>146.&nbsp;complex&lt;T&gt; Inserter and Extractor need sentries</h3></a><p><b>Section:</b>&nbsp;26.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.ops"> [lib.complex.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;12 May 1999</p>
4096 <p>The <u> extractor</u> for complex numbers is specified as:&nbsp;</p>
4098 <blockquote>
4100 <p> template&lt;class T, class charT, class traits&gt;&nbsp;<br>
4101 basic_istream&lt;charT, traits&gt;&amp;&nbsp;<br>
4102 operator&gt;&gt;(basic_istream&lt;charT, traits&gt;&amp; is, complex&lt;T&gt;&amp; x);<br>
4103 &nbsp;<br>
4104 Effects: Extracts a complex number x of the form: u, (u), or (u,v),
4105 where u is the real part and v is the imaginary part
4106 (lib.istream.formatted).&nbsp;<br>
4107 Requires: The input values be convertible to T. If bad input is
4108 encountered, calls is.setstate(ios::failbit) (which may throw
4109 ios::failure (lib.iostate.flags).&nbsp;<br>
4110 Returns: is .</p>
4112 </blockquote>
4113 <p>Is it intended that the extractor for complex numbers does not skip
4114 whitespace, unlike all other extractors in the standard library do?
4115 Shouldn't a sentry be used?&nbsp;<br>
4116 <br>
4117 The <u>inserter</u> for complex numbers is specified as:</p>
4119 <blockquote>
4121 <p> template&lt;class T, class charT, class traits&gt;&nbsp;<br>
4122 basic_ostream&lt;charT, traits&gt;&amp;&nbsp;<br>
4123 operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; o, const complex&lt;T&gt;&amp; x);<br>
4124 <br>
4125 Effects: inserts the complex number x onto the stream o as if it were implemented as follows:<br>
4126 <br>
4127 template&lt;class T, class charT, class traits&gt;&nbsp;<br>
4128 basic_ostream&lt;charT, traits&gt;&amp;&nbsp;<br>
4129 operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; o, const complex&lt;T&gt;&amp; x)&nbsp;<br>
4130 {&nbsp;<br>
4131 basic_ostringstream&lt;charT, traits&gt; s;&nbsp;<br>
4132 s.flags(o.flags());&nbsp;<br>
4133 s.imbue(o.getloc());&nbsp;<br>
4134 s.precision(o.precision());&nbsp;<br>
4135 s &lt;&lt; '(' &lt;&lt; x.real() &lt;&lt; "," &lt;&lt; x.imag() &lt;&lt; ')';&nbsp;<br>
4136 return o &lt;&lt; s.str();&nbsp;<br>
4137 }</p>
4139 </blockquote>
4141 <p>Is it intended that the inserter for complex numbers ignores the
4142 field width and does not do any padding? If, with the suggested
4143 implementation above, the field width were set in the stream then the
4144 opening parentheses would be adjusted, but the rest not, because the
4145 field width is reset to zero after each insertion.</p>
4147 <p>I think that both operations should use sentries, for sake of
4148 consistency with the other inserters and extractors in the
4149 library. Regarding the issue of padding in the inserter, I don't know
4150 what the intent was.&nbsp;</p>
4151 <p><b>Proposed resolution:</b></p>
4152 <p>After 26.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.complex.ops"> [lib.complex.ops]</a> paragraph 14 (operator&gt;&gt;), add a
4153 Notes clause:</p>
4155 <blockquote>
4157 <p>Notes: This extraction is performed as a series of simpler
4158 extractions. Therefore, the skipping of whitespace is specified to be the
4159 same for each of the simpler extractions.</p>
4161 </blockquote>
4162 <p><b>Rationale:</b></p>
4163 <p>For extractors, the note is added to make it clear that skipping whitespace
4164 follows an "all-or-none" rule.</p>
4166 <p>For inserters, the LWG believes there is no defect; the standard is correct
4167 as written.</p>
4168 <hr>
4169 <a name="147"><h3>147.&nbsp;Library Intro refers to global functions that aren't global</h3></a><p><b>Section:</b>&nbsp;17.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.global.functions"> [lib.global.functions]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Lois Goldthwaite&nbsp; <b>Date:</b>&nbsp;4 Jun 1999</p>
4170 <p>The library had many global functions until 17.4.1.1 [lib.contents]
4171 paragraph 2 was added: </p>
4173 <blockquote>
4175 <p>All library entities except macros, operator new and operator
4176 delete are defined within the namespace std or namespaces nested
4177 within namespace std. </p>
4179 </blockquote>
4181 <p>It appears "global function" was never updated in the following: </p>
4183 <blockquote>
4185 <p>17.4.4.3 - Global functions [lib.global.functions]<br>
4186 <br>
4187 -1- It is unspecified whether any global functions in the C++ Standard
4188 Library are defined as inline (dcl.fct.spec).<br>
4189 <br>
4190 -2- A call to a global function signature described in Clauses
4191 lib.language.support through lib.input.output behaves the same as if
4192 the implementation declares no additional global function
4193 signatures.*<br>
4194 <br>
4195 [Footnote: A valid C++ program always calls the expected library
4196 global function. An implementation may also define additional
4197 global functions that would otherwise not be called by a valid C++
4198 program. --- end footnote]<br>
4199 <br>
4200 -3- A global function cannot be declared by the implementation as
4201 taking additional default arguments.&nbsp;<br>
4202 <br>
4203 17.4.4.4 - Member functions [lib.member.functions]<br>
4204 <br>
4205 -2- An implementation can declare additional non-virtual member
4206 function signatures within a class: </p>
4208 <blockquote>
4210 <p>-- by adding arguments with default values to a member function
4211 signature; The same latitude does not extend to the implementation of
4212 virtual or global functions, however. </p>
4214 </blockquote>
4215 </blockquote>
4216 <p><b>Proposed resolution:</b></p>
4217 <p> Change "global" to "global or non-member" in:</p>
4218 <blockquote>
4219 <p>17.4.4.3 [lib.global.functions] section title,<br>
4220 17.4.4.3 [lib.global.functions] para 1,<br>
4221 17.4.4.3 [lib.global.functions] para 2 in 2 places plus 2
4222 places in the footnote,<br>
4223 17.4.4.3 [lib.global.functions] para 3,<br>
4224 17.4.4.4 [lib.member.functions] para 2</p>
4225 </blockquote>
4226 <p><b>Rationale:</b></p>
4228 Because operator new and delete are global, the proposed resolution
4229 was changed from "non-member" to "global or non-member.
4230 </p>
4231 <hr>
4232 <a name="148"><h3>148.&nbsp;Functions in the example facet BoolNames should be const</h3></a><p><b>Section:</b>&nbsp;22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Jeremy Siek&nbsp; <b>Date:</b>&nbsp;3 Jun 1999</p>
4233 <p>In 22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a> paragraph 13, the do_truename() and
4234 do_falsename() functions in the example facet BoolNames should be
4235 const. The functions they are overriding in
4236 numpunct_byname&lt;char&gt; are const. </p>
4237 <p><b>Proposed resolution:</b></p>
4238 <p>In 22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a> paragraph 13, insert "const" in
4239 two places:</p>
4240 <blockquote>
4241 <p><tt>string do_truename() const { return "Oui Oui!"; }<br>
4242 string do_falsename() const { return "Mais Non!"; }</tt></p>
4243 </blockquote>
4244 <hr>
4245 <a name="150"><h3>150.&nbsp;Find_first_of says integer instead of iterator </h3></a><p><b>Section:</b>&nbsp;25.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.find.first.of"> [lib.alg.find.first.of]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt McClure&nbsp; <b>Date:</b>&nbsp;30 Jun 1999</p>
4246 <p><b>Proposed resolution:</b></p>
4247 <p>Change 25.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.find.first.of"> [lib.alg.find.first.of]</a> paragraph 2 from:</p>
4249 <blockquote>
4250 <p>Returns: The first iterator i in the range [first1, last1) such
4251 that for some <u>integer</u> j in the range [first2, last2) ...</p>
4252 </blockquote>
4254 <p>to:</p>
4256 <blockquote>
4257 <p>Returns: The first iterator i in the range [first1, last1) such
4258 that for some iterator j in the range [first2, last2) ...</p>
4259 </blockquote>
4260 <hr>
4261 <a name="151"><h3>151.&nbsp;Can't currently clear() empty container</h3></a><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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Ed Brey&nbsp; <b>Date:</b>&nbsp;21 Jun 1999</p>
4262 <p>For both sequences and associative containers, a.clear() has the
4263 semantics of erase(a.begin(),a.end()), which is undefined for an empty
4264 container since erase(q1,q2) requires that q1 be dereferenceable
4265 (23.1.1,3 and 23.1.2,7). When the container is empty, a.begin() is
4266 not dereferenceable.<br>
4267 <br>
4268 The requirement that q1 be unconditionally dereferenceable causes many
4269 operations to be intuitively undefined, of which clearing an empty
4270 container is probably the most dire.<br>
4271 <br>
4272 Since q1 and q2 are only referenced in the range [q1, q2), and [q1,
4273 q2) is required to be a valid range, stating that q1 and q2 must be
4274 iterators or certain kinds of iterators is unnecessary.
4275 </p>
4276 <p><b>Proposed resolution:</b></p>
4277 <p>In 23.1.1, paragraph 3, change:</p>
4278 <blockquote>
4279 <p>p and q2 denote valid iterators to a, q <u> and q1</u> denote valid dereferenceable iterators to a, [q1, q2) denotes a valid range</p>
4280 </blockquote>
4281 <p>to:</p>
4282 <blockquote>
4283 <p>p denotes a valid iterator to a, q denotes a valid dereferenceable iterator to a, [q1, q2) denotes a valid range<u>
4284 in a</u></p>
4285 </blockquote>
4286 <p>In 23.1.2, paragraph 7, change:</p>
4287 <blockquote>
4288 <p>p and q2 are valid iterators to a, q <u> and q1</u> are valid dereferenceable
4289 iterators to a, [q1, q2) is a valid range</p>
4290 </blockquote>
4291 <p>to</p>
4292 <blockquote>
4293 <p>p is a valid iterator to a, q is a valid dereferenceable iterator to a, [q1, q2) is a valid range
4294 <u>into a</u></p>
4295 </blockquote>
4296 <hr>
4297 <a name="152"><h3>152.&nbsp;Typo in <tt>scan_is()</tt> semantics</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4298 <p>The semantics of <tt>scan_is()</tt> (paragraphs 4 and 6) is not exactly described
4299 because there is no function <tt>is()</tt> which only takes a character as
4300 argument. Also, in the effects clause (paragraph 3), the semantic is also kept
4301 vague.</p>
4302 <p><b>Proposed resolution:</b></p>
4303 <p>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> paragraphs 4 and 6, change the returns
4304 clause from:</p>
4305 <blockquote>
4306 <p>"... such that <tt>is(*p)</tt>
4307 would..."</p>
4308 </blockquote>
4309 <p>to:&nbsp; "... such that <tt>is(m, *p)</tt>
4310 would...."</p>
4311 <hr>
4312 <a name="153"><h3>153.&nbsp;Typo in <tt>narrow()</tt> semantics</h3></a><p><b>Section:</b>&nbsp;22.2.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.char.members"> [lib.facet.ctype.char.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4313 <p>The description of the array version of <tt>narrow()</tt> (in
4314 paragraph 11) is flawed: There is no member <tt>do_narrow()</tt> which
4315 takes only three arguments because in addition to the range a default
4316 character is needed.</p>
4318 <p>Additionally, for both <tt>widen</tt> and <tt>narrow</tt> we have
4319 two signatures followed by a <b>Returns</b> clause that only addresses
4320 one of them.</p>
4322 <p><b>Proposed resolution:</b></p>
4323 <p>Change the returns clause in 22.2.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.char.members"> [lib.facet.ctype.char.members]</a>
4324 paragraph 10 from:</p>
4325 <p>&nbsp;&nbsp;&nbsp; Returns: do_widen(low, high, to).</p>
4327 <p>to:</p>
4328 <p>&nbsp;&nbsp;&nbsp; Returns: do_widen(c) or do_widen(low, high, to),
4329 respectively.</p>
4331 <p>Change 22.2.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.ctype.char.members"> [lib.facet.ctype.char.members]</a> paragraph 10 and 11 from:</p>
4332 <pre> char narrow(char c, char /*dfault*/) const;
4333 const char* narrow(const char* low, const char* high,
4334 char /*dfault*/, char* to) const;</pre>
4335 <pre> Returns: do_narrow(low, high, to).</pre>
4336 <p>to:</p>
4337 <pre> char narrow(char c, char dfault) const;
4338 const char* narrow(const char* low, const char* high,
4339 char dfault, char* to) const;</pre>
4340 <pre> Returns: do_narrow(c, dfault) or
4341 do_narrow(low, high, dfault, to), respectively.</pre>
4343 <p><i>[Kona: 1) the problem occurs in additional places, 2) a user
4344 defined version could be different.]</i></p>
4346 <p><i>[Post-Tokyo: Dietmar provided the above wording at the request of
4347 the LWG. He could find no other places the problem occurred. He
4348 asks for clarification of the Kona "a user defined
4349 version..." comment above. Perhaps it was a circuitous way of
4350 saying "dfault" needed to be uncommented?]</i></p>
4352 <p><i>[Post-Toronto: the issues list maintainer has merged in the
4353 proposed resolution from issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#207">207</a>, which addresses the
4354 same paragraphs.]</i></p>
4355 <hr>
4356 <a name="154"><h3>154.&nbsp;Missing <tt>double</tt> specifier for <tt>do_get()</tt>
4357 </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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4358 <p>The table in paragraph 7 for the length modifier does not list the length
4359 modifier <tt>l</tt> to be applied if the type is <tt>double</tt>. Thus, the
4360 standard asks the implementation to do undefined things when using <tt>scanf()</tt>
4361 (the missing length modifier for <tt>scanf()</tt> when scanning <tt>double</tt>s
4362 is actually a problem I found quite often in production code, too).</p>
4363 <p><b>Proposed resolution:</b></p>
4364 <p>In 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>, paragraph 7, add a row in the Length
4365 Modifier table to say that for <tt>double</tt> a length modifier
4366 <tt>l</tt> is to be used.</p>
4367 <p><b>Rationale:</b></p>
4368 <p>The standard makes an embarrassing beginner's mistake.</p>
4369 <hr>
4370 <a name="155"><h3>155.&nbsp;Typo in naming the class defining the class <tt>Init</tt>
4371 </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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4372 <p>There are conflicting statements about where the class
4373 <tt>Init</tt> is defined. According to 27.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostream.objects"> [lib.iostream.objects]</a> paragraph 2
4374 it is defined as <tt>basic_ios::Init</tt>, according to 27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a> it is defined as <tt>ios_base::Init</tt>.</p>
4375 <p><b>Proposed resolution:</b></p>
4376 <p>Change 27.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostream.objects"> [lib.iostream.objects]</a> paragraph 2 from
4377 "<tt>basic_ios::Init"</tt> to
4378 "<tt>ios_base::Init"</tt>.</p>
4379 <p><b>Rationale:</b></p>
4380 <p>Although not strictly wrong, the standard was misleading enough to warrant
4381 the change.</p>
4382 <hr>
4383 <a name="156"><h3>156.&nbsp;Typo in <tt>imbue()</tt> description</h3></a><p><b>Section:</b>&nbsp;27.4.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.locales"> [lib.ios.base.locales]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4384 <p>There is a small discrepancy between the declarations of
4385 <tt>imbue()</tt>: in 27.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base"> [lib.ios.base]</a> the argument is passed as
4386 <tt>locale const&amp;</tt> (correct), in 27.4.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.locales"> [lib.ios.base.locales]</a> it
4387 is passed as <tt>locale const</tt> (wrong).</p>
4388 <p><b>Proposed resolution:</b></p>
4389 <p>In 27.4.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.locales"> [lib.ios.base.locales]</a> change the <tt>imbue</tt> argument
4390 from "<tt>locale const" to "locale
4391 const&amp;".</tt></p>
4392 <hr>
4393 <a name="158"><h3>158.&nbsp;Underspecified semantics for <tt>setbuf()</tt>
4394 </h3></a><p><b>Section:</b>&nbsp;27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4395 <p>The default behavior of <tt>setbuf()</tt> is described only for the
4396 situation that <tt>gptr() != 0 &amp;&amp; gptr() != egptr()</tt>:
4397 namely to do nothing. What has to be done in other situations&nbsp;
4398 is not described although there is actually only one reasonable
4399 approach, namely to do nothing, too.</p>
4401 <p>Since changing the buffer would almost certainly mess up most
4402 buffer management of derived classes unless these classes do it
4403 themselves, the default behavior of <tt>setbuf()</tt> should always be
4404 to do nothing.</p>
4405 <p><b>Proposed resolution:</b></p>
4406 <p>Change 27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a>, paragraph 3, Default behavior,
4407 to: "Default behavior: Does nothing. Returns this."</p>
4408 <hr>
4409 <a name="159"><h3>159.&nbsp;Strange use of <tt>underflow()</tt>
4410 </h3></a><p><b>Section:</b>&nbsp;27.5.2.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.get"> [lib.streambuf.virt.get]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4411 <p>The description of the meaning of the result of
4412 <tt>showmanyc()</tt> seems to be rather strange: It uses calls to
4413 <tt>underflow()</tt>. Using <tt>underflow()</tt> is strange because
4414 this function only reads the current character but does not extract
4415 it, <tt>uflow()</tt> would extract the current character. This should
4416 be fixed to use <tt>sbumpc()</tt> instead.</p>
4417 <p><b>Proposed resolution:</b></p>
4418 <p>Change 27.5.2.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.get"> [lib.streambuf.virt.get]</a> paragraph 1,
4419 <tt>showmanyc()</tt>returns clause, by replacing the word
4420 "supplied" with the words "extracted from the
4421 stream".</p>
4422 <hr>
4423 <a name="160"><h3>160.&nbsp;Typo: Use of non-existing function <tt>exception()</tt>
4424 </h3></a><p><b>Section:</b>&nbsp;27.6.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream"> [lib.istream]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4425 <p>The paragraph 4 refers to the function <tt>exception()</tt> which
4426 is not defined. Probably, the referred function is
4427 <tt>basic_ios&lt;&gt;::exceptions()</tt>.</p>
4428 <p><b>Proposed resolution:</b></p>
4429 <p>In 27.6.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream"> [lib.istream]</a>, 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 1,
4430 27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>, paragraph 3, and 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>,
4431 paragraph 1, change "<tt>exception()" to
4432 "exceptions()"</tt>.</p>
4434 <p><i>[Note to Editor: "exceptions" with an "s"
4435 is the correct spelling.]</i></p>
4436 <hr>
4437 <a name="161"><h3>161.&nbsp;Typo: <tt>istream_iterator</tt> vs. <tt>istreambuf_iterator</tt>
4438 </h3></a><p><b>Section:</b>&nbsp;27.6.1.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.arithmetic"> [lib.istream.formatted.arithmetic]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4439 <p>The note in the second paragraph pretends that the first argument
4440 is an object of type <tt>istream_iterator</tt>. This is wrong: It is
4441 an object of type <tt>istreambuf_iterator</tt>.</p>
4442 <p><b>Proposed resolution:</b></p>
4443 <p>Change 27.6.1.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.arithmetic"> [lib.istream.formatted.arithmetic]</a> from:</p>
4444 <blockquote>
4445 <p>The first argument provides an object of the istream_iterator class...</p>
4446 </blockquote>
4447 <p>to</p>
4448 <blockquote>
4449 <p>The first argument provides an object of the istreambuf_iterator class...</p>
4450 </blockquote>
4451 <hr>
4452 <a name="164"><h3>164.&nbsp;do_put() has apparently unused fill argument</h3></a><p><b>Section:</b>&nbsp;22.2.5.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.put.virtuals"> [lib.locale.time.put.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4453 <p>In 22.2.5.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.put.virtuals"> [lib.locale.time.put.virtuals]</a> the do_put() function is specified
4454 as taking a fill character as an argument, but the description of the
4455 function does not say whether the character is used at all and, if so,
4456 in which way. The same holds for any format control parameters that
4457 are accessible through the ios_base&amp; argument, such as the
4458 adjustment or the field width. Is strftime() supposed to use the fill
4459 character in any way? In any case, the specification of
4460 time_put.do_put() looks inconsistent to me.<br> <br> Is the
4461 signature of do_put() wrong, or is the effects clause incomplete?</p>
4462 <p><b>Proposed resolution:</b></p>
4463 <p>Add the following note after 22.2.5.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.put.virtuals"> [lib.locale.time.put.virtuals]</a>
4464 paragraph 2:</p>
4465 <blockquote>
4466 <p> [Note: the <tt>fill</tt> argument may be used in the implementation-defined formats, or by derivations. A space character is a reasonable default
4467 for this argument. --end Note]</p>
4468 </blockquote>
4469 <p><b>Rationale:</b></p>
4470 <p>The LWG felt that while the normative text was correct,
4471 users need some guidance on what to pass for the <tt>fill</tt>
4472 argument since the standard doesn't say how it's used.</p>
4473 <hr>
4474 <a name="165"><h3>165.&nbsp;<tt>xsputn()</tt>, <tt>pubsync()</tt> never called by <tt>basic_ostream</tt> members?</h3></a><p><b>Section:</b>&nbsp;27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4475 <p>Paragraph 2 explicitly states that none of the <tt>basic_ostream</tt>
4476 functions falling into one of the groups "formatted output functions"
4477 and "unformatted output functions" calls any stream buffer function
4478 which might call a virtual function other than <tt>overflow()</tt>. Basically
4479 this is fine but this implies that <tt>sputn()</tt> (this function would call
4480 the virtual function <tt>xsputn()</tt>) is never called by any of the standard
4481 output functions. Is this really intended? At minimum it would be convenient to
4482 call <tt>xsputn()</tt> for strings... Also, the statement that <tt>overflow()</tt>
4483 is the only virtual member of <tt>basic_streambuf</tt> called is in conflict
4484 with the definition of <tt>flush()</tt> which calls <tt>rdbuf()-&gt;pubsync()</tt>
4485 and thereby the virtual function <tt>sync()</tt> (<tt>flush()</tt> is listed
4486 under "unformatted output functions").</p>
4487 <p>In addition, I guess that the sentence starting with "They may use other
4488 public members of <tt>basic_ostream</tt> ..." probably was intended to
4489 start with "They may use other public members of <tt>basic_streamuf</tt>..."
4490 although the problem with the virtual members exists in both cases.</p>
4491 <p>I see two obvious resolutions:</p>
4492 <ol>
4493 <li>state in a footnote that this means that <tt>xsputn()</tt> will never be
4494 called by any ostream member and that this is intended.</li>
4495 <li>relax the restriction and allow calling <tt>overflow()</tt> and <tt>xsputn()</tt>.
4496 Of course, the problem with <tt>flush()</tt> has to be resolved in some way.</li>
4497 </ol>
4498 <p><b>Proposed resolution:</b></p>
4499 <p>Change the last sentence of 27.6.2.1 (lib.ostream) paragraph 2 from:</p>
4500 <blockquote>
4501 <p>They may use other public members of basic_ostream except that they do not
4502 invoke any virtual members of rdbuf() except overflow().</p>
4503 </blockquote>
4504 <p>to:</p>
4505 <blockquote>
4506 <p>They may use other public members of basic_ostream except that they shall
4507 not invoke any virtual members of rdbuf() except overflow(), xsputn(), and
4508 sync().</p>
4509 </blockquote>
4511 <p><i>[Kona: the LWG believes this is a problem. Wish to ask Jerry or
4512 PJP why the standard is written this way.]</i></p>
4514 <p><i>[Post-Tokyo: Dietmar supplied wording at the request of the
4515 LWG. He comments: The rules can be made a little bit more specific if
4516 necessary be explicitly spelling out what virtuals are allowed to be
4517 called from what functions and eg to state specifically that flush()
4518 is allowed to call sync() while other functions are not.]</i></p>
4519 <hr>
4520 <a name="167"><h3>167.&nbsp;Improper use of <tt>traits_type::length()</tt>
4521 </h3></a><p><b>Section:</b>&nbsp;27.6.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.character"> [lib.ostream.inserters.character]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4522 <p>Paragraph 4 states that the length is determined using
4523 <tt>traits::length(s)</tt>. Unfortunately, this function is not
4524 defined for example if the character type is <tt>wchar_t</tt> and the
4525 type of <tt>s</tt> is <tt>char const*</tt>. Similar problems exist if
4526 the character type is <tt>char</tt> and the type of <tt>s</tt> is
4527 either <tt>signed char const*</tt> or <tt>unsigned char
4528 const*</tt>.</p>
4529 <p><b>Proposed resolution:</b></p>
4530 <p>Change 27.6.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.character"> [lib.ostream.inserters.character]</a> paragraph 4 from:</p>
4531 <blockquote>
4532 <p>Effects: Behaves like an formatted inserter (as described in
4533 lib.ostream.formatted.reqmts) of out. After a sentry object is
4534 constructed it inserts characters. The number of characters starting
4535 at s to be inserted is traits::length(s). Padding is determined as
4536 described in lib.facet.num.put.virtuals. The traits::length(s)
4537 characters starting at s are widened using out.widen
4538 (lib.basic.ios.members). The widened characters and any required
4539 padding are inserted into out. Calls width(0).</p>
4540 </blockquote>
4541 <p>to:</p>
4542 <blockquote>
4543 <p>Effects: Behaves like a formatted inserter (as described in
4544 lib.ostream.formatted.reqmts) of out. After a sentry object is
4545 constructed it inserts <i>n</i> characters starting at <i>s</i>,
4546 where <i>n</i> is the number that would be computed as if by:</p>
4547 <ul>
4548 <li>traits::length(s) for the overload where the first argument is of
4549 type basic_ostream&lt;charT, traits&gt;&amp; and the second is
4550 of type const charT*, and also for the overload where the first
4551 argument is of type basic_ostream&lt;char, traits&gt;&amp; and
4552 the second is of type const char*.</li>
4553 <li>std::char_traits&lt;char&gt;::length(s)
4554 for the overload where the first argument is of type
4555 basic_ostream&lt;charT, traits&gt;&amp; and the second is of type
4556 const char*.</li>
4557 <li>traits::length(reinterpret_cast&lt;const char*&gt;(s))
4558 for the other two overloads.</li>
4559 </ul>
4560 <p>Padding is determined as described in
4561 lib.facet.num.put.virtuals. The <i>n</i> characters starting at
4562 <i>s</i> are widened using out.widen (lib.basic.ios.members). The
4563 widened characters and any required padding are inserted into
4564 out. Calls width(0).</p>
4565 </blockquote>
4567 <p><i>[Santa Cruz: Matt supplied new wording]</i></p>
4569 <p><i>[Kona: changed "where <i>n</i> is" to " where <i>n</i> is the
4570 number that would be computed as if by"]</i></p>
4572 <p><b>Rationale:</b></p>
4573 <p>We have five separate cases. In two of them we can use the
4574 user-supplied traits class without any fuss. In the other three we
4575 try to use something as close to that user-supplied class as possible.
4576 In two cases we've got a traits class that's appropriate for
4577 char and what we've got is a const signed char* or a const
4578 unsigned char*; that's close enough so we can just use a reinterpret
4579 cast, and continue to use the user-supplied traits class. Finally,
4580 there's one case where we just have to give up: where we've got a
4581 traits class for some arbitrary charT type, and we somehow have to
4582 deal with a const char*. There's nothing better to do but fall back
4583 to char_traits&lt;char&gt;</p>
4584 <hr>
4585 <a name="168"><h3>168.&nbsp;Typo: formatted vs. unformatted</h3></a><p><b>Section:</b>&nbsp;27.6.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.unformatted"> [lib.ostream.unformatted]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4586 <p>The first paragraph begins with a descriptions what has to be done
4587 in <i>formatted</i> output functions. Probably this is a typo and the
4588 paragraph really want to describe unformatted output functions...</p>
4589 <p><b>Proposed resolution:</b></p>
4590 <p>In 27.6.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.unformatted"> [lib.ostream.unformatted]</a> paragraph 1, the first and last
4591 sentences, change the word "formatted" to
4592 "unformatted":</p>
4593 <blockquote>
4594 <p>"Each <b>unformatted </b> output function begins ..."<br>
4595 "... value specified for the <b>unformatted </b> output
4596 function."</p>
4597 </blockquote>
4598 <hr>
4599 <a name="169"><h3>169.&nbsp;Bad efficiency of <tt>overflow()</tt> mandated</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4600 <p>Paragraph 8, Notes, of this section seems to mandate an extremely
4601 inefficient way of buffer handling for <tt>basic_stringbuf</tt>,
4602 especially in view of the restriction that <tt>basic_ostream</tt>
4603 member functions are not allowed to use <tt>xsputn()</tt> (see 27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>): For each character to be inserted, a new buffer
4604 is to be created.</p>
4605 <p>Of course, the resolution below requires some handling of
4606 simultaneous input and output since it is no longer possible to update
4607 <tt>egptr()</tt> whenever <tt>epptr()</tt> is changed. A possible
4608 solution is to handle this in <tt>underflow()</tt>.</p>
4609 <p><b>Proposed resolution:</b></p>
4610 <p>In 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> paragraph 8, Notes, insert the words
4611 "at least" as in the following:</p>
4612 <blockquote>
4613 <p>To make a write position available, the function reallocates (or initially
4614 allocates) an array object with a sufficient number of elements to hold the
4615 current array object (if any), plus <b>at least</b> one additional write
4616 position.</p>
4617 </blockquote>
4618 <hr>
4619 <a name="170"><h3>170.&nbsp;Inconsistent definition of <tt>traits_type</tt>
4620 </h3></a><p><b>Section:</b>&nbsp;27.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringstream"> [lib.stringstream]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4621 <p>The classes <tt>basic_stringstream</tt> (27.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringstream"> [lib.stringstream]</a>),
4622 <tt>basic_istringstream</tt> (27.7.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istringstream"> [lib.istringstream]</a>), and
4623 <tt>basic_ostringstream</tt> (27.7.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostringstream"> [lib.ostringstream]</a>) are inconsistent
4624 in their definition of the type <tt>traits_type</tt>: For
4625 <tt>istringstream</tt>, this type is defined, for the other two it is
4626 not. This should be consistent.</p>
4627 <p><b>Proposed resolution:</b></p>
4628 <p><b>Proposed resolution:</b></p> <p>To the declarations of
4629 <tt>basic_ostringstream</tt> (27.7.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostringstream"> [lib.ostringstream]</a>) and
4630 <tt>basic_stringstream</tt> (27.7.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringstream"> [lib.stringstream]</a>) add:</p>
4631 <blockquote>
4632 <pre>typedef traits traits_type;</pre>
4633 </blockquote>
4634 <hr>
4635 <a name="171"><h3>171.&nbsp;Strange <tt>seekpos()</tt> semantics due to joint position</h3></a><p><b>Section:</b>&nbsp;27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Jul 1999</p>
4636 <p>Overridden virtual functions, seekpos()</p> <p>In 27.8.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf"> [lib.filebuf]</a> paragraph 3, it is stated that a joint input and
4637 output position is maintained by <tt>basic_filebuf</tt>. Still, the
4638 description of <tt>seekpos()</tt> seems to talk about different file
4639 positions. In particular, it is unclear (at least to me) what is
4640 supposed to happen to the output buffer (if there is one) if only the
4641 input position is changed. The standard seems to mandate that the
4642 output buffer is kept and processed as if there was no positioning of
4643 the output position (by changing the input position). Of course, this
4644 can be exactly what you want if the flag <tt>ios_base::ate</tt> is
4645 set. However, I think, the standard should say something like
4646 this:</p>
4647 <ul>
4648 <li>If <tt>(which &amp; mode) == 0</tt> neither read nor write position is
4649 changed and the call fails. Otherwise, the joint read and write position is
4650 altered to correspond to <tt>sp</tt>.</li>
4651 <li>If there is an output buffer, the output sequences is updated and any
4652 unshift sequence is written before the position is altered.</li>
4653 <li>If there is an input buffer, the input sequence is updated after the
4654 position is altered.</li>
4655 </ul>
4656 <p>Plus the appropriate error handling, that is...</p>
4657 <p><b>Proposed resolution:</b></p>
4658 <p>Change the unnumbered paragraph in 27.8.1.4 (lib.filebuf.virtuals) before
4659 paragraph 14 from:</p>
4660 <blockquote>
4661 <p>pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in |
4662 ios_base::out);</p>
4663 <p>Alters the file position, if possible, to correspond to the position stored
4664 in sp (as described below).</p>
4665 <p>- if (which&amp;ios_base::in)!=0, set the file position to sp, then update
4666 the input sequence</p>
4667 <p>- if (which&amp;ios_base::out)!=0, then update the output sequence, write
4668 any unshift sequence, and set the file position to sp.</p>
4669 </blockquote>
4670 <p>to:</p>
4671 <blockquote>
4672 <p>pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in |
4673 ios_base::out);</p>
4674 <p>Alters the file position, if possible, to correspond to the position stored
4675 in sp (as described below). Altering the file position performs as follows:</p>
4676 <p>1. if (om &amp; ios_base::out)!=0, then update the output sequence and
4677 write any unshift sequence;</p>
4678 <p>2. set the file position to sp;</p>
4679 <p>3. if (om &amp; ios_base::in)!=0, then update the input sequence;</p>
4680 <p>where om is the open mode passed to the last call to open(). The operation
4681 fails if is_open() returns false.</p>
4682 </blockquote>
4684 <p><i>[Kona: Dietmar is working on a proposed resolution.]</i></p>
4685 <p><i>[Post-Tokyo: Dietmar supplied the above wording.]</i></p>
4686 <hr>
4687 <a name="172"><h3>172.&nbsp;Inconsistent types for <tt>basic_istream::ignore()</tt>
4688 </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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Greg Comeau, Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4689 <p>In 27.6.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream"> [lib.istream]</a> the function
4690 <tt>ignore()</tt> gets an object of type <tt>streamsize</tt> as first
4691 argument. However, 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>
4692 paragraph 23 the first argument is of type <tt>int.</tt></p>
4694 <p>As far as I can see this is not really a contradiction because
4695 everything is consistent if <tt>streamsize</tt> is typedef to be
4696 <tt>int</tt>. However, this is almost certainly not what was
4697 intended. The same thing happened to <tt>basic_filebuf::setbuf()</tt>,
4698 as described in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#173">173</a>.</p>
4700 <p>Darin Adler also
4701 submitted this issue, commenting: Either 27.6.1.1 should be modified
4702 to show a first parameter of type int, or 27.6.1.3 should be modified
4703 to show a first parameter of type streamsize and use
4704 numeric_limits&lt;streamsize&gt;::max.</p>
4705 <p><b>Proposed resolution:</b></p>
4706 <p>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 23 and 24, change both uses
4707 of <tt>int</tt> in the description of <tt>ignore()</tt> to
4708 <tt>streamsize</tt>.</p>
4709 <hr>
4710 <a name="173"><h3>173.&nbsp;Inconsistent types for <tt>basic_filebuf::setbuf()</tt>
4711 </h3></a><p><b>Section:</b>&nbsp;27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Greg Comeau, Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4714 In 27.8.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf"> [lib.filebuf]</a> the function <tt>setbuf()</tt> gets an
4715 object of type <tt>streamsize</tt> as second argument. However, in
4716 27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a> paragraph 9 the second argument is of type
4717 <tt>int</tt>.
4718 </p>
4721 As far as I can see this is not really a contradiction because
4722 everything is consistent if <tt>streamsize</tt> is typedef to be
4723 <tt>int</tt>. However, this is almost certainly not what was
4724 intended. The same thing happened to <tt>basic_istream::ignore()</tt>,
4725 as described in issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#172">172</a>.
4726 </p>
4728 <p><b>Proposed resolution:</b></p>
4729 <p>In 27.8.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.filebuf.virtuals"> [lib.filebuf.virtuals]</a> paragraph 9, change all uses of
4730 <tt>int</tt> in the description of <tt>setbuf()</tt> to
4731 <tt>streamsize</tt>.</p>
4732 <hr>
4733 <a name="174"><h3>174.&nbsp;Typo: <tt>OFF_T</tt> vs. <tt>POS_T</tt>
4734 </h3></a><p><b>Section:</b>&nbsp;D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4735 <p>According to paragraph 1 of this section, <tt>streampos</tt> is the
4736 type <tt>OFF_T</tt>, the same type as <tt>streamoff</tt>. However, in
4737 paragraph 6 the <tt>streampos</tt> gets the type <tt>POS_T</tt></p>
4738 <p><b>Proposed resolution:</b></p>
4739 <p>Change D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a> paragraph 1 from "<tt>typedef
4740 OFF_T streampos;</tt>" to "<tt>typedef POS_T
4741 streampos;</tt>"</p>
4742 <hr>
4743 <a name="175"><h3>175.&nbsp;Ambiguity for <tt>basic_streambuf::pubseekpos()</tt> and a few other functions.</h3></a><p><b>Section:</b>&nbsp;D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4744 <p>According to paragraph 8 of this section, the methods
4745 <tt>basic_streambuf::pubseekpos()</tt>,
4746 <tt>basic_ifstream::open()</tt>, and <tt>basic_ofstream::open</tt>
4747 "may" be overloaded by a version of this function taking the
4748 type <tt>ios_base::open_mode</tt> as last argument argument instead of
4749 <tt>ios_base::openmode</tt> (<tt>ios_base::open_mode</tt> is defined
4750 in this section to be an alias for one of the integral types). The
4751 clause specifies, that the last argument has a default argument in
4752 three cases. However, this generates an ambiguity with the overloaded
4753 version because now the arguments are absolutely identical if the last
4754 argument is not specified.</p>
4755 <p><b>Proposed resolution:</b></p>
4756 <p>In D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a> paragraph 8, remove the default arguments for
4757 <tt>basic_streambuf::pubseekpos()</tt>,
4758 <tt>basic_ifstream::open()</tt>, and
4759 <tt>basic_ofstream::open().</tt></p>
4760 <hr>
4761 <a name="176"><h3>176.&nbsp;<tt>exceptions()</tt> in <tt>ios_base</tt>...?</h3></a><p><b>Section:</b>&nbsp;D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;23 Jul 1999</p>
4762 <p>The "overload" for the function <tt>exceptions()</tt> in
4763 paragraph 8 gives the impression that there is another function of
4764 this function defined in class <tt>ios_base</tt>. However, this is not
4765 the case. Thus, it is hard to tell how the semantics (paragraph 9) can
4766 be implemented: "Call the corresponding member function specified
4767 in clause 27 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.input.output"> [lib.input.output]</a>."</p>
4768 <p><b>Proposed resolution:</b></p>
4769 <p>In D.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/future.html#depr.ios.members"> [depr.ios.members]</a> paragraph 8, move the declaration of the
4770 function <tt>exceptions()</tt>into class <tt>basic_ios</tt>.</p>
4771 <hr>
4772 <a name="179"><h3>179.&nbsp;Comparison of const_iterators to iterators doesn't work</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;2 Jul 1998</p>
4773 <p>Currently the following will not compile on two well-known standard
4774 library implementations:</p>
4776 <blockquote>
4777 <pre>#include &lt;set&gt;
4778 using namespace std;
4780 void f(const set&lt;int&gt; &amp;s)
4782 set&lt;int&gt;::iterator i;
4783 if (i==s.end()); // s.end() returns a const_iterator
4784 }</pre>
4785 </blockquote>
4788 The reason this doesn't compile is because operator== was implemented
4789 as a member function of the nested classes set:iterator and
4790 set::const_iterator, and there is no conversion from const_iterator to
4791 iterator. Surprisingly, (s.end() == i) does work, though, because of
4792 the conversion from iterator to const_iterator.
4793 </p>
4796 I don't see a requirement anywhere in the standard that this must
4797 work. Should there be one? If so, I think the requirement would need
4798 to be added to the tables in section 24.1.1. I'm not sure about the
4799 wording. If this requirement existed in the standard, I would think
4800 that implementors would have to make the comparison operators
4801 non-member functions.</p>
4803 <p>This issues was also raised on comp.std.c++ by Darin
4804 Adler.&nbsp; The example given was:</p>
4806 <blockquote>
4807 <pre>bool check_equal(std::deque&lt;int&gt;::iterator i,
4808 std::deque&lt;int&gt;::const_iterator ci)
4810 return i == ci;
4811 }</pre>
4812 </blockquote>
4814 <p>Comment from John Potter:</p>
4815 <blockquote>
4817 In case nobody has noticed, accepting it will break reverse_iterator.
4818 </p>
4821 The fix is to make the comparison operators templated on two types.
4822 </p>
4824 <pre> template &lt;class Iterator1, class Iterator2&gt;
4825 bool operator== (reverse_iterator&lt;Iterator1&gt; const&amp; x,
4826 reverse_iterator&lt;Iterator2&gt; const&amp; y);
4827 </pre>
4830 Obviously: return x.base() == y.base();
4831 </p>
4834 Currently, no reverse_iterator to const_reverse_iterator compares are
4835 valid.
4836 </p>
4839 BTW, I think the issue is in support of bad code. Compares should be
4840 between two iterators of the same type. All std::algorithms require
4841 the begin and end iterators to be of the same type.
4842 </p>
4843 </blockquote>
4844 <p><b>Proposed resolution:</b></p>
4845 <p>Insert this paragraph after 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 7:</p>
4846 <blockquote>
4847 <p>In the expressions</p>
4848 <pre> i == j
4849 i != j
4850 i &lt; j
4851 i &lt;= j
4852 i &gt;= j
4853 i &gt; j
4854 i - j
4855 </pre>
4856 <p>Where i and j denote objects of a container's iterator type,
4857 either or both may be replaced by an object of the container's
4858 const_iterator type referring to the same element with no
4859 change in semantics.</p>
4860 </blockquote>
4862 <p><i>[post-Toronto: Judy supplied a proposed resolution saying that
4863 <tt>iterator</tt> and <tt>const_iterator</tt> could be freely mixed in
4864 iterator comparison and difference operations.]</i></p>
4866 <p><i>[Redmond: Dave and Howard supplied a new proposed resolution which
4867 explicitly listed expressions; there was concern that the previous
4868 proposed resolution was too informal.]</i></p>
4869 <p><b>Rationale:</b></p>
4871 The LWG believes it is clear that the above wording applies only to
4872 the nested types <tt>X::iterator</tt> and <tt>X::const_iterator</tt>,
4873 where <tt>X</tt> is a container. There is no requirement that
4874 <tt>X::reverse_iterator</tt> and <tt>X::const_reverse_iterator</tt>
4875 can be mixed. If mixing them is considered important, that's a
4876 separate issue. (Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#280">280</a>.)
4877 </p>
4878 <hr>
4879 <a name="181"><h3>181.&nbsp;make_pair() unintended behavior</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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;3 Aug 1999</p>
4880 <p>The claim has surfaced in Usenet that expressions such as<br>
4881 <br>
4882 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>make_pair("abc", 3)</tt><br>
4883 <br>
4884 are illegal, notwithstanding their use in examples, because template instantiation tries to bind the first template
4885 parameter to <tt> const char (&amp;)[4]</tt>, which type is uncopyable.<br>
4886 <br>
4887 I doubt anyone intended that behavior...
4888 </p>
4889 <p><b>Proposed resolution:</b></p>
4890 <p>In 20.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.utility"> [lib.utility]</a>, paragraph 1 change the following
4891 declaration of make_pair():</p>
4892 <blockquote>
4893 <pre>template &lt;class T1, class T2&gt; pair&lt;T1,T2&gt; make_pair(const T1&amp;, const T2&amp;);</pre>
4894 </blockquote>
4895 <p>to:</p>
4896 <blockquote>
4897 <pre>template &lt;class T1, class T2&gt; pair&lt;T1,T2&gt; make_pair(T1, T2);</pre>
4898 </blockquote>
4899 <p> In 20.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.pairs"> [lib.pairs]</a> paragraph 7 and the line before, change:</p>
4900 <blockquote>
4901 <pre>template &lt;class T1, class T2&gt;
4902 pair&lt;T1, T2&gt; make_pair(const T1&amp; x, const T2&amp; y);</pre>
4903 </blockquote>
4904 <p>to:</p>
4905 <blockquote>
4906 <pre>template &lt;class T1, class T2&gt;
4907 pair&lt;T1, T2&gt; make_pair(T1 x, T2 y);</pre>
4908 </blockquote>
4909 <p>and add the following footnote to the effects clause:</p>
4910 <blockquote>
4911 <p> According to 12.8 [class.copy], an implementation is permitted
4912 to not perform a copy of an argument, thus avoiding unnecessary
4913 copies.</p>
4914 </blockquote>
4915 <p><b>Rationale:</b></p>
4916 <p>Two potential fixes were suggested by Matt Austern and Dietmar
4917 Kühl, respectively, 1) overloading with array arguments, and 2) use of
4918 a reference_traits class with a specialization for arrays. Andy
4919 Koenig suggested changing to pass by value. In discussion, it appeared
4920 that this was a much smaller change to the standard that the other two
4921 suggestions, and any efficiency concerns were more than offset by the
4922 advantages of the solution. Two implementors reported that the
4923 proposed resolution passed their test suites.</p>
4924 <hr>
4925 <a name="182"><h3>182.&nbsp;Ambiguous references to size_t</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Al Stevens&nbsp; <b>Date:</b>&nbsp;15 Aug 1999</p>
4926 <p>Many references to <tt> size_t</tt> throughout the document
4927 omit the <tt> std::</tt> namespace qualification.</p> <p>For
4928 example, 17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a> paragraph 2:</p>
4929 <blockquote>
4930 <pre>&#8212; operator new(size_t)
4931 &#8212; operator new(size_t, const std::nothrow_t&amp;)
4932 &#8212; operator new[](size_t)
4933 &#8212; operator new[](size_t, const std::nothrow_t&amp;)</pre>
4934 </blockquote>
4935 <p><b>Proposed resolution:</b></p>
4936 <p> In 17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a> paragraph 2: replace:</p>
4937 <blockquote>
4938 <p><tt> - operator new(size_t)<br>
4939 - operator new(size_t, const std::nothrow_t&amp;)<br>
4940 - operator new[](size_t)<br>
4941 - operator new[](size_t, const std::nothrow_t&amp;)</tt></p>
4942 </blockquote>
4943 <p> by:</p>
4944 <blockquote>
4945 <pre>- operator new(std::size_t)
4946 - operator new(std::size_t, const std::nothrow_t&amp;)
4947 - operator new[](std::size_t)
4948 - operator new[](std::size_t, const std::nothrow_t&amp;)</pre>
4949 </blockquote>
4950 <p>In [lib.allocator.requirements] 20.1.5, paragraph 4: replace:</p>
4951 <blockquote>
4952 <p>The typedef members pointer, const_pointer, size_type, and difference_type
4953 are required to be T*, T const*, size_t, and ptrdiff_t, respectively.</p>
4954 </blockquote>
4955 <p>&nbsp;by:</p>
4956 <blockquote>
4957 <p>The typedef members pointer, const_pointer, size_type, and difference_type
4958 are required to be T*, T const*, std::size_t, and std::ptrdiff_t,
4959 respectively.</p>
4960 </blockquote>
4961 <p>In [lib.allocator.members] 20.4.1.1, paragraphs 3 and 6: replace:</p>
4962 <blockquote>
4963 <p>3 Notes: Uses ::operator new(size_t) (18.4.1).</p>
4964 <p>6 Note: the storage is obtained by calling ::operator new(size_t), but it
4965 is unspecified when or how often this function is called. The use of hint is
4966 unspecified, but intended as an aid to locality if an implementation so
4967 desires.</p>
4968 </blockquote>
4969 <p>by:</p>
4970 <blockquote>
4971 <p>3 Notes: Uses ::operator new(std::size_t) (18.4.1).</p>
4972 <p>6 Note: the storage is obtained by calling ::operator new(std::size_t), but
4973 it is unspecified when or how often this function is called. The use of hint
4974 is unspecified, but intended as an aid to locality if an implementation so
4975 desires.</p>
4976 </blockquote>
4977 <p>In [lib.char.traits.require] 21.1.1, paragraph 1: replace:</p>
4978 <blockquote>
4979 <p>In Table 37, X denotes a Traits class defining types and functions for the
4980 character container type CharT; c and d denote values of type CharT; p and q
4981 denote values of type const CharT*; s denotes a value of type CharT*; n, i and
4982 j denote values of type size_t; e and f denote values of type X::int_type; pos
4983 denotes a value of type X::pos_type; and state denotes a value of type X::state_type.</p>
4984 </blockquote>
4985 <p>by:</p>
4986 <blockquote>
4987 <p>In Table 37, X denotes a Traits class defining types and functions for the
4988 character container type CharT; c and d denote values of type CharT; p and q
4989 denote values of type const CharT*; s denotes a value of type CharT*; n, i and
4990 j denote values of type std::size_t; e and f denote values of type X::int_type;
4991 pos denotes a value of type X::pos_type; and state denotes a value of type X::state_type.</p>
4992 </blockquote>
4993 <p>In [lib.char.traits.require] 21.1.1, table 37: replace the return type of
4994 X::length(p): "size_t" by "std::size_t".</p>
4995 <p> In [lib.std.iterator.tags] 24.3.3, paragraph 2: replace:<br>
4996 &nbsp;&nbsp;&nbsp; typedef ptrdiff_t difference_type;<br>
4997 by:<br>
4998 &nbsp;&nbsp;&nbsp; typedef std::ptrdiff_t difference_type;</p>
4999 <p> In [lib.locale.ctype] 22.2.1.1 put namespace std { ...} around the
5000 declaration of template &lt;class charT&gt; class ctype.<br>
5001 <br>
5002 In [lib.iterator.traits] 24.3.1, paragraph 2 put namespace std { ...} around the declaration of:<br>
5003 <br>
5004 &nbsp;&nbsp;&nbsp; template&lt;class Iterator&gt; struct iterator_traits<br>
5005 &nbsp;&nbsp;&nbsp; template&lt;class T&gt; struct iterator_traits&lt;T*&gt;<br>
5006 &nbsp;&nbsp;&nbsp; template&lt;class T&gt; struct iterator_traits&lt;const T*&gt;</p>
5007 <p><b>Rationale:</b></p>
5008 <p>The LWG believes correcting names like <tt>size_t</tt> and
5009 <tt>ptrdiff_t</tt> to <tt>std::size_t</tt> and <tt>std::ptrdiff_t</tt>
5010 to be essentially editorial. There there can't be another size_t or
5011 ptrdiff_t meant anyway because, according to 17.4.3.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.extern.types"> [lib.extern.types]</a>,</p>
5013 <blockquote>
5014 For each type T from the Standard C library, the types ::T and std::T
5015 are reserved to the implementation and, when defined, ::T shall be
5016 identical to std::T.
5017 </blockquote>
5019 <p>The issue is treated as a Defect Report to make explicit the Project
5020 Editor's authority to make this change.</p>
5022 <p><i>[Post-Tokyo: Nico Josuttis provided the above wording at the
5023 request of the LWG.]</i></p>
5025 <p><i>[Toronto: This is tangentially related to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#229">229</a>, but only tangentially: the intent of this issue is to
5026 address use of the name <tt>size_t</tt> in contexts outside of
5027 namespace std, such as in the description of <tt>::operator new</tt>.
5028 The proposed changes should be reviewed to make sure they are
5029 correct.]</i></p>
5031 <p><i>[pre-Copenhagen: Nico has reviewed the changes and believes
5032 them to be correct.]</i></p>
5034 <hr>
5035 <a name="183"><h3>183.&nbsp;I/O stream manipulators don't work for wide character streams</h3></a><p><b>Section:</b>&nbsp;27.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.std.manip"> [lib.std.manip]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Sawyer&nbsp; <b>Date:</b>&nbsp;7 Jul 1999</p>
5036 <p>27.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.std.manip"> [lib.std.manip]</a> paragraph 3 says (clause numbering added for
5037 exposition):</p>
5038 <blockquote>
5039 <p>Returns: An object s of unspecified type such that if [1] out is an (instance
5040 of) basic_ostream then the expression out&lt;&lt;s behaves as if f(s) were
5041 called, and if [2] in is an (instance of) basic_istream then the expression
5042 in&gt;&gt;s behaves as if f(s) were called. Where f can be defined as: ios_base&amp;
5043 f(ios_base&amp; str, ios_base::fmtflags mask) { // reset specified flags
5044 str.setf(ios_base::fmtflags(0), mask); return str; } [3] The expression
5045 out&lt;&lt;s has type ostream&amp; and value out. [4] The expression in&gt;&gt;s
5046 has type istream&amp; and value in.</p>
5047 </blockquote>
5048 <p>Given the definitions [1] and [2] for out and in, surely [3] should read:
5049 "The expression out &lt;&lt; s has type basic_ostream&amp; ..." and
5050 [4] should read: "The expression in &gt;&gt; s has type basic_istream&amp;
5051 ..."</p>
5052 <p>If the wording in the standard is correct, I can see no way of implementing
5053 any of the manipulators so that they will work with wide character streams.</p>
5054 <p>e.g. wcout &lt;&lt; setbase( 16 );</p>
5055 <p>Must have value 'wcout' (which makes sense) and type 'ostream&amp;' (which
5056 doesn't).</p>
5057 <p>The same "cut'n'paste" type also seems to occur in Paras 4,5,7 and
5058 8. In addition, Para 6 [setfill] has a similar error, but relates only to
5059 ostreams.</p>
5060 <p>I'd be happier if there was a better way of saying this, to make it clear
5061 that the value of the expression is "the same specialization of
5062 basic_ostream as out"&amp;</p>
5063 <p><b>Proposed resolution:</b></p>
5064 <p>Replace section 27.6.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.std.manip"> [lib.std.manip]</a> except paragraph 1 with the
5065 following:</p>
5066 <blockquote>
5067 <p>2- The type designated smanip in each of the following function
5068 descriptions is implementation-specified and may be different for each
5069 function.<br>
5070 <br>
5071 <tt>smanip resetiosflags(ios_base::fmtflags mask);</tt><br>
5072 <br>
5073 -3- Returns: An object s of unspecified type such that if out is an
5074 instance of basic_ostream&lt;charT,traits&gt; then the expression
5075 out&lt;&lt;s behaves
5076 as if f(s, mask) were called, or if in is an instance of
5077 basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s
5078 behaves as if
5079 f(s, mask) were called. The function f can be defined as:*<br>
5080 <br>
5081 [Footnote: The expression cin &gt;&gt; resetiosflags(ios_base::skipws)
5082 clears ios_base::skipws in the format flags stored in the
5083 basic_istream&lt;charT,traits&gt; object cin (the same as cin &gt;&gt;
5084 noskipws), and the expression cout &lt;&lt;
5085 resetiosflags(ios_base::showbase) clears
5086 ios_base::showbase in the format flags stored in the
5087 basic_ostream&lt;charT,traits&gt; object cout (the same as cout
5088 &lt;&lt;
5089 noshowbase). --- end footnote]<br>
5090 <br>
5091 &nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, ios_base::fmtflags mask)<br>
5092 &nbsp;&nbsp; {<br>
5093 &nbsp;&nbsp; // reset specified flags<br>
5094 &nbsp;&nbsp; str.setf(ios_base::fmtflags(0), mask);<br>
5095 &nbsp;&nbsp; return str;<br>
5096 &nbsp;&nbsp; }<br>
5097 </tt><br>
5098 The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
5099 The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
5100 <br>
5101 &nbsp;<tt>smanip setiosflags(ios_base::fmtflags mask);</tt><br>
5102 <br>
5103 -4- Returns: An object s of unspecified type such that if out is an
5104 instance of basic_ostream&lt;charT,traits&gt; then the expression
5105 out&lt;&lt;s behaves
5106 as if f(s, mask) were called, or if in is an instance of
5107 basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s
5108 behaves as if f(s,
5109 mask) were called. The function f can be defined as:<br>
5110 <br>
5111 &nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, ios_base::fmtflags mask)<br>
5112 &nbsp;&nbsp; {<br>
5113 &nbsp;&nbsp; // set specified flags<br>
5114 &nbsp;&nbsp; str.setf(mask);<br>
5115 &nbsp;&nbsp; return str;<br>
5116 &nbsp;&nbsp; }<br>
5117 </tt><br>
5118 The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
5119 The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
5120 <br>
5121 <tt>smanip setbase(int base);</tt><br>
5122 <br>
5123 -5- Returns: An object s of unspecified type such that if out is an
5124 instance of basic_ostream&lt;charT,traits&gt; then the expression
5125 out&lt;&lt;s behaves
5126 as if f(s, base) were called, or if in is an instance of
5127 basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s
5128 behaves as if f(s,
5129 base) were called. The function f can be defined as:<br>
5130 <br>
5131 &nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int base)<br>
5132 &nbsp;&nbsp; {<br>
5133 &nbsp;&nbsp; // set basefield<br>
5134 &nbsp;&nbsp; str.setf(base == 8 ? ios_base::oct :<br>
5135 &nbsp;&nbsp; base == 10 ? ios_base::dec :<br>
5136 &nbsp;&nbsp; base == 16 ? ios_base::hex :<br>
5137 &nbsp;&nbsp; ios_base::fmtflags(0), ios_base::basefield);<br>
5138 &nbsp;&nbsp; return str;<br>
5139 &nbsp;&nbsp; }<br>
5140 </tt><br>
5141 The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
5142 The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in.<br>
5143 <br>
5144 <tt>smanip setfill(char_type c);<br>
5145 </tt><br>
5146 -6- Returns: An object s of unspecified type such that if out is (or is
5147 derived from) basic_ostream&lt;charT,traits&gt; and c has type charT
5148 then the
5149 expression out&lt;&lt;s behaves as if f(s, c) were called. The function
5150 f can be
5151 defined as:<br>
5152 <br>
5153 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>template&lt;class charT, class traits&gt;<br>
5154 &nbsp;&nbsp; basic_ios&lt;charT,traits&gt;&amp; f(basic_ios&lt;charT,traits&gt;&amp; str, charT c)<br>
5155 &nbsp;&nbsp; {<br>
5156 &nbsp;&nbsp; // set fill character<br>
5157 &nbsp;&nbsp; str.fill(c);<br>
5158 &nbsp;&nbsp; return str;<br>
5159 &nbsp;&nbsp; }<br>
5160 </tt><br>
5161 The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.<br>
5162 <br>
5163 <tt>smanip setprecision(int n);</tt><br>
5164 <br>
5165 -7- Returns: An object s of unspecified type such that if out is an
5166 instance of basic_ostream&lt;charT,traits&gt; then the expression
5167 out&lt;&lt;s behaves
5168 as if f(s, n) were called, or if in is an instance of
5169 basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s
5170 behaves as if f(s, n)
5171 were called. The function f can be defined as:<br>
5172 <br>
5173 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int n)<br>
5174 &nbsp;&nbsp; {<br>
5175 &nbsp;&nbsp; // set precision<br>
5176 &nbsp;&nbsp; str.precision(n);<br>
5177 &nbsp;&nbsp; return str;<br>
5178 &nbsp;&nbsp; }<br>
5179 </tt><br>
5180 The expression out&lt;&lt;s has type basic_ostream&lt;charT,traits&gt;&amp; and value out.
5181 The expression in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value in<br>
5182 .<br>
5183 <tt>smanip setw(int n);<br>
5184 </tt><br>
5185 -8- Returns: An object s of unspecified type such that if out is an
5186 instance of basic_ostream&lt;charT,traits&gt; then the expression
5187 out&lt;&lt;s behaves
5188 as if f(s, n) were called, or if in is an instance of
5189 basic_istream&lt;charT,traits&gt; then the expression in&gt;&gt;s
5190 behaves as if f(s, n)
5191 were called. The function f can be defined as:<br>
5192 <br>
5193 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>ios_base&amp; f(ios_base&amp; str, int n)<br>
5194 &nbsp;&nbsp; {<br>
5195 &nbsp;&nbsp; // set width<br>
5196 &nbsp;&nbsp; str.width(n);<br>
5197 &nbsp;&nbsp; return str;<br>
5198 &nbsp;&nbsp; }<br>
5199 </tt><br>
5200 The expression out&lt;&lt;s has type
5201 basic_ostream&lt;charT,traits&gt;&amp; and value out. The expression
5202 in&gt;&gt;s has type basic_istream&lt;charT,traits&gt;&amp; and value
5204 </p>
5205 </blockquote>
5207 <p><i>[Kona: Andy Sawyer and Beman Dawes will work to improve the wording of
5208 the proposed resolution.]</i></p>
5210 <p><i>[Tokyo - The LWG noted that issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#216">216</a> involves
5211 the same paragraphs.]</i></p>
5213 <p><i>[Post-Tokyo: The issues list maintainer combined the proposed
5214 resolution of this issue with the proposed resolution for issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#216">216</a> as they both involved the same paragraphs, and were so
5215 intertwined that dealing with them separately appear fraught with
5216 error. The full text was supplied by Bill Plauger; it was cross
5217 checked against changes supplied by Andy Sawyer. It should be further
5218 checked by the LWG.]</i></p>
5219 <hr>
5220 <a name="184"><h3>184.&nbsp;numeric_limits&lt;bool&gt; wording problems</h3></a><p><b>Section:</b>&nbsp;18.2.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.numeric.special"> [lib.numeric.special]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Gabriel Dos Reis&nbsp; <b>Date:</b>&nbsp;21 Jul 1999</p>
5221 <p>bools are defined by the standard to be of integer types, as per
5222 3.9.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/basic.html#basic.fundamental"> [basic.fundamental]</a> paragraph 7. However "integer types"
5223 seems to have a special meaning for the author of 18.2. The net effect
5224 is an unclear and confusing specification for
5225 numeric_limits&lt;bool&gt; as evidenced below.</p>
5227 <p>18.2.1.2/7 says numeric_limits&lt;&gt;::digits is, for built-in integer
5228 types, the number of non-sign bits in the representation.</p>
5230 <p>4.5/4 states that a bool promotes to int ; whereas 4.12/1 says any non zero
5231 arithmetical value converts to true.</p>
5233 <p>I don't think it makes sense at all to require
5234 numeric_limits&lt;bool&gt;::digits and numeric_limits&lt;bool&gt;::digits10 to
5235 be meaningful.</p>
5237 <p>The standard defines what constitutes a signed (resp. unsigned) integer
5238 types. It doesn't categorize bool as being signed or unsigned. And the set of
5239 values of bool type has only two elements.</p>
5241 <p>I don't think it makes sense to require numeric_limits&lt;bool&gt;::is_signed
5242 to be meaningful.</p>
5244 <p>18.2.1.2/18 for numeric_limits&lt;integer_type&gt;::radix&nbsp; says:</p>
5245 <blockquote>
5246 <p>For integer types, specifies the base of the representation.186)</p>
5247 </blockquote>
5249 <p>This disposition is at best misleading and confusing for the standard
5250 requires a "pure binary numeration system" for integer types as per
5251 3.9.1/7</p>
5253 <p>The footnote 186) says: "Distinguishes types with base other than 2 (e.g
5254 BCD)."&nbsp; This also erroneous as the standard never defines any integer
5255 types with base representation other than 2.</p>
5257 <p>Furthermore, numeric_limits&lt;bool&gt;::is_modulo and
5258 numeric_limits&lt;bool&gt;::is_signed have similar problems.</p>
5259 <p><b>Proposed resolution:</b></p>
5260 <p>Append to the end of 18.2.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.numeric.special"> [lib.numeric.special]</a>:</p>
5261 <blockquote>
5262 <p>The specialization for bool shall be provided as follows:</p>
5263 <pre> namespace std {
5264 template&lt;&gt; class numeric_limits&lt;bool&gt; {
5265 public:
5266 static const bool is_specialized = true;
5267 static bool min() throw() { return false; }
5268 static bool max() throw() { return true; }
5270 static const int digits = 1;
5271 static const int digits10 = 0;
5272 static const bool is_signed = false;
5273 static const bool is_integer = true;
5274 static const bool is_exact = true;
5275 static const int radix = 2;
5276 static bool epsilon() throw() { return 0; }
5277 static bool round_error() throw() { return 0; }
5279 static const int min_exponent = 0;
5280 static const int min_exponent10 = 0;
5281 static const int max_exponent = 0;
5282 static const int max_exponent10 = 0;
5284 static const bool has_infinity = false;
5285 static const bool has_quiet_NaN = false;
5286 static const bool has_signaling_NaN = false;
5287 static const float_denorm_style has_denorm = denorm_absent;
5288 static const bool has_denorm_loss = false;
5289 static bool infinity() throw() { return 0; }
5290 static bool quiet_NaN() throw() { return 0; }
5291 static bool signaling_NaN() throw() { return 0; }
5292 static bool denorm_min() throw() { return 0; }
5294 static const bool is_iec559 = false;
5295 static const bool is_bounded = true;
5296 static const bool is_modulo = false;
5298 static const bool traps = false;
5299 static const bool tinyness_before = false;
5300 static const float_round_style round_style = round_toward_zero;
5302 }</pre>
5303 </blockquote>
5305 <p><i>[Tokyo:&nbsp; The LWG desires wording that specifies exact values
5306 rather than more general wording in the original proposed
5307 resolution.]</i></p>
5309 <p><i>[Post-Tokyo:&nbsp; At the request of the LWG in Tokyo, Nico
5310 Josuttis provided the above wording.]</i></p>
5311 <hr>
5312 <a name="185"><h3>185.&nbsp;Questionable use of term "inline"</h3></a><p><b>Section:</b>&nbsp;20.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.objects"> [lib.function.objects]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;UK Panel&nbsp; <b>Date:</b>&nbsp;26 Jul 1999</p>
5313 <p>Paragraph 4 of 20.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.objects"> [lib.function.objects]</a> says:</p>
5314 <blockquote>
5315 <p>&nbsp;[Example: To negate every element of a: transform(a.begin(), a.end(),
5316 a.begin(), negate&lt;double&gt;()); The corresponding functions will inline
5317 the addition and the negation. end example]</p>
5318 </blockquote>
5319 <p>(Note: The "addition" referred to in the above is in para 3) we can
5320 find no other wording, except this (non-normative) example which suggests that
5321 any "inlining" will take place in this case.</p>
5322 <p>Indeed both:</p>
5323 <blockquote>
5324 <p>17.4.4.3 Global Functions [lib.global.functions] 1 It is
5325 unspecified whether any global functions in the C++ Standard Library
5326 are defined as inline (7.1.2).</p>
5327 </blockquote>
5328 <p>and</p>
5329 <blockquote>
5330 <p>17.4.4.4 Member Functions [lib.member.functions] 1 It is
5331 unspecified whether any member functions in the C++ Standard Library
5332 are defined as inline (7.1.2).</p>
5333 </blockquote>
5334 <p>take care to state that this may indeed NOT be the case.</p>
5335 <p>Thus the example "mandates" behavior that is explicitly
5336 not required elsewhere.</p>
5337 <p><b>Proposed resolution:</b></p>
5338 <p>In 20.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.objects"> [lib.function.objects]</a> paragraph 1, remove the sentence:</p>
5339 <blockquote>
5340 <p>They are important for the effective use of the library.</p>
5341 </blockquote>
5342 <p>Remove 20.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.objects"> [lib.function.objects]</a> paragraph 2, which reads:</p>
5343 <blockquote>
5344 <p> Using function objects together with function templates
5345 increases the expressive power of the library as well as making the
5346 resulting code much more efficient.</p>
5347 </blockquote>
5348 <p>In 20.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.objects"> [lib.function.objects]</a> paragraph 4, remove the sentence:</p>
5349 <blockquote>
5350 <p>The corresponding functions will inline the addition and the
5351 negation.</p>
5352 </blockquote>
5354 <p><i>[Kona: The LWG agreed there was a defect.]</i></p>
5355 <p><i>[Tokyo: The LWG crafted the proposed resolution.]</i></p>
5356 <hr>
5357 <a name="186"><h3>186.&nbsp;bitset::set() second parameter should be bool</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Darin Adler&nbsp; <b>Date:</b>&nbsp;13 Aug 1999</p>
5358 <p>In section 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>, paragraph 13 defines the
5359 bitset::set operation to take a second parameter of type int. The
5360 function tests whether this value is non-zero to determine whether to
5361 set the bit to true or false. The type of this second parameter should
5362 be bool. For one thing, the intent is to specify a Boolean value. For
5363 another, the result type from test() is bool. In addition, it's
5364 possible to slice an integer that's larger than an int. This can't
5365 happen with bool, since conversion to bool has the semantic of
5366 translating 0 to false and any non-zero value to true.</p>
5367 <p><b>Proposed resolution:</b></p>
5368 <p>In 23.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.template.bitset"> [lib.template.bitset]</a> Para 1 Replace:</p>
5369 <blockquote>
5370 <pre>bitset&lt;N&gt;&amp; set(size_t pos, int val = true ); </pre>
5371 </blockquote>
5372 <p>With:</p>
5373 <blockquote>
5374 <pre>bitset&lt;N&gt;&amp; set(size_t pos, bool val = true );</pre>
5375 </blockquote>
5376 <p>In 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> Para 12(.5) Replace:</p>
5377 <blockquote>
5378 <pre>bitset&lt;N&gt;&amp; set(size_t pos, int val = 1 );</pre>
5379 </blockquote>
5380 <p>With:</p>
5381 <blockquote>
5382 <pre>bitset&lt;N&gt;&amp; set(size_t pos, bool val = true );</pre>
5383 </blockquote>
5385 <p><i>[Kona: The LWG agrees with the description.&nbsp; Andy Sawyer will work
5386 on better P/R wording.]</i></p>
5387 <p><i>[Post-Tokyo: Andy provided the above wording.]</i></p>
5388 <p><b>Rationale:</b></p>
5389 <p><tt>bool</tt> is a better choice. It is believed that binary
5390 compatibility is not an issue, because this member function is
5391 usually implemented as <tt>inline</tt>, and because it is already
5392 the case that users cannot rely on the type of a pointer to a
5393 nonvirtual member of a standard library class.</p>
5394 <hr>
5395 <a name="187"><h3>187.&nbsp;iter_swap underspecified</h3></a><p><b>Section:</b>&nbsp;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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;14 Aug 1999</p>
5396 <p>The description of iter_swap in 25.2.2 paragraph 7,says that it
5397 ``exchanges the values'' of the objects to which two iterators
5398 refer.<br> <br> What it doesn't say is whether it does so using swap
5399 or using the assignment operator and copy constructor.<br> <br> This
5400 question is an important one to answer, because swap is specialized to
5401 work efficiently for standard containers.<br> For example:</p>
5402 <blockquote>
5403 <pre>vector&lt;int&gt; v1, v2;
5404 iter_swap(&amp;v1, &amp;v2);</pre>
5405 </blockquote>
5406 <p>Is this call to iter_swap equivalent to calling swap(v1, v2)?&nbsp;
5407 Or is it equivalent to</p>
5408 <blockquote>
5409 <pre>{
5410 vector&lt;int&gt; temp = v1;
5411 v1 = v2;
5412 v2 = temp;
5413 }</pre>
5414 </blockquote>
5415 <p>The first alternative is O(1); the second is O(n).</p>
5416 <p>A LWG member, Dave Abrahams, comments:</p>
5417 <blockquote>
5418 <p>Not an objection necessarily, but I want to point out the cost of
5419 that requirement:</p>
5420 <blockquote>
5421 <p><tt>iter_swap(list&lt;T&gt;::iterator, list&lt;T&gt;::iterator)</tt></p>
5422 </blockquote>
5423 <p>can currently be specialized to be more efficient than
5424 iter_swap(T*,T*) for many T (by using splicing). Your proposal would
5425 make that optimization illegal.&nbsp;</p>
5426 </blockquote>
5428 <p><i>[Kona: The LWG notes the original need for iter_swap was proxy iterators
5429 which are no longer permitted.]</i></p>
5430 <p><b>Proposed resolution:</b></p>
5431 <p>Change the effect clause of iter_swap in 25.2.2 paragraph 7 from:</p>
5432 <blockquote>
5433 <p>Exchanges the values pointed to by the two iterators a and b.</p>
5434 </blockquote>
5435 <p>to</p>
5436 <blockquote>
5437 <p><tt>swap(*a, *b)</tt>.</p>
5438 </blockquote>
5440 <p><b>Rationale:</b></p>
5441 <p>It's useful to say just what <tt>iter_swap</tt> does. There may be
5442 some iterators for which we want to specialize <tt>iter_swap</tt>,
5443 but the fully general version should have a general specification.</p>
5445 <p>Note that in the specific case of <tt>list&lt;T&gt;::iterator</tt>,
5446 iter_swap should not be specialized as suggested above. That would do
5447 much more than exchanging the two iterators' values: it would change
5448 predecessor/successor relationships, possibly moving the iterator from
5449 one list to another. That would surely be inappropriate.</p>
5450 <hr>
5451 <a name="189"><h3>189.&nbsp;setprecision() not specified correctly</h3></a><p><b>Section:</b>&nbsp;27.4.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fmtflags.state"> [lib.fmtflags.state]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;25 Aug 1999</p>
5452 <p>27.4.2.2 paragraph 9 claims that setprecision() sets the precision,
5453 and includes a parenthetical note saying that it is the number of
5454 digits after the decimal point.<br>
5455 <br>
5456 This claim is not strictly correct. For example, in the default
5457 floating-point output format, setprecision sets the number of
5458 significant digits printed, not the number of digits after the decimal
5459 point.<br>
5460 <br>
5461 I would like the committee to look at the definition carefully and
5462 correct the statement in 27.4.2.2</p>
5463 <p><b>Proposed resolution:</b></p>
5464 <p>Remove from 27.4.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fmtflags.state"> [lib.fmtflags.state]</a>, paragraph 9, the text
5465 "(number of digits after the decimal point)".</p>
5466 <hr>
5467 <a name="193"><h3>193.&nbsp;Heap operations description incorrect</h3></a><p><b>Section:</b>&nbsp;25.3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.heap.operations"> [lib.alg.heap.operations]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Markus Mauhart&nbsp; <b>Date:</b>&nbsp;24 Sep 1999</p>
5468 <p>25.3.6 [lib.alg.heap.operations] states two key properties of a heap [a,b), the first of them
5469 is<br>
5470 <br>
5471 &nbsp;&nbsp;&nbsp; `"(1) *a is the largest element"<br>
5472 <br>
5473 I think this is incorrect and should be changed to the wording in the proposed
5474 resolution.</p>
5475 <p>Actually there are two independent changes:</p>
5476 <blockquote>
5477 <p>A-"part of largest equivalence class" instead of "largest", cause 25.3
5478 [lib.alg.sorting] asserts "strict weak ordering" for all its sub clauses.</p>
5479 <p>B-Take
5480 'an oldest' from that equivalence class, otherwise the heap functions
5481 could not be used for a priority queue as explained in 23.2.3.2.2
5482 [lib.priqueue.members] (where I assume that a "priority queue" respects
5483 priority AND time).</p>
5484 </blockquote>
5485 <p><b>Proposed resolution:</b></p>
5486 <p>Change 25.3.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.heap.operations"> [lib.alg.heap.operations]</a> property (1) from:</p>
5487 <blockquote>
5488 <p>(1) *a is the largest element</p>
5489 </blockquote>
5490 <p>to:</p>
5491 <blockquote>
5492 <p>(1) There is no element greater than <tt>*a</tt></p>
5493 </blockquote>
5494 <hr>
5495 <a name="195"><h3>195.&nbsp;Should <tt>basic_istream::sentry</tt>'s constructor ever set eofbit?</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;13 Oct 1999</p>
5496 <p>Suppose that <tt>is.flags() &amp; ios_base::skipws</tt> is nonzero.
5497 What should <tt>basic_istream&lt;&gt;::sentry</tt>'s constructor do if it
5498 reaches eof while skipping whitespace? 27.6.1.1.2/5 suggests it
5499 should set failbit. Should it set eofbit as well? The standard
5500 doesn't seem to answer that question.</p>
5502 <p>On the one hand, nothing in 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> says that
5503 <tt>basic_istream&lt;&gt;::sentry</tt> should ever set eofbit. On the
5504 other hand, 27.6.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream"> [lib.istream]</a> paragraph 4 says that if
5505 extraction from a <tt>streambuf</tt> "returns
5506 <tt>traits::eof()</tt>, then the input function, except as explicitly
5507 noted otherwise, completes its actions and does
5508 <tt>setstate(eofbit)"</tt>. So the question comes down to
5509 whether <tt>basic_istream&lt;&gt;::sentry</tt>'s constructor is an
5510 input function.</p>
5512 <p>Comments from Jerry Schwarz:</p>
5513 <blockquote>
5514 <p>It was always my intention that eofbit should be set any time that a
5515 virtual returned something to indicate eof, no matter what reason
5516 iostream code had for calling the virtual.</p>
5518 The motivation for this is that I did not want to require streambufs
5519 to behave consistently if their virtuals are called after they have
5520 signaled eof.</p>
5522 The classic case is a streambuf reading from a UNIX file. EOF isn't
5523 really a state for UNIX file descriptors. The convention is that a
5524 read on UNIX returns 0 bytes to indicate "EOF", but the file
5525 descriptor isn't shut down in any way and future reads do not
5526 necessarily also return 0 bytes. In particular, you can read from
5527 tty's on UNIX even after they have signaled "EOF". (It
5528 isn't always understood that a ^D on UNIX is not an EOF indicator, but
5529 an EOL indicator. By typing a "line" consisting solely of
5530 ^D you cause a read to return 0 bytes, and by convention this is
5531 interpreted as end of file.)</p>
5532 </blockquote>
5533 <p><b>Proposed resolution:</b></p>
5534 <p>Add a sentence to the end of 27.6.1.1.2 paragraph 2:</p>
5535 <blockquote>
5536 <p>If <tt>is.rdbuf()-&gt;sbumpc()</tt> or <tt>is.rdbuf()-&gt;sgetc()</tt>
5537 returns <tt>traits::eof()</tt>, the function calls
5538 <tt>setstate(failbit | eofbit)</tt> (which may throw
5539 <tt>ios_base::failure</tt>).
5540 </p>
5541 </blockquote>
5542 <hr>
5543 <a name="198"><h3>198.&nbsp;Validity of pointers and references unspecified after iterator destruction</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;3 Nov 1999</p>
5545 Is a pointer or reference obtained from an iterator still valid after
5546 destruction of the iterator?
5547 </p>
5549 Is a pointer or reference obtained from an iterator still valid after the value
5550 of the iterator changes?
5551 </p>
5552 <blockquote>
5553 <pre>#include &lt;iostream&gt;
5554 #include &lt;vector&gt;
5555 #include &lt;iterator&gt;
5557 int main()
5559 typedef std::vector&lt;int&gt; vec_t;
5560 vec_t v;
5561 v.push_back( 1 );
5563 // Is a pointer or reference obtained from an iterator still
5564 // valid after destruction of the iterator?
5565 int * p = &amp;*v.begin();
5566 std::cout &lt;&lt; *p &lt;&lt; '\n'; // OK?
5568 // Is a pointer or reference obtained from an iterator still
5569 // valid after the value of the iterator changes?
5570 vec_t::iterator iter( v.begin() );
5571 p = &amp;*iter++;
5572 std::cout &lt;&lt; *p &lt;&lt; '\n'; // OK?
5574 return 0;
5576 </pre>
5577 </blockquote>
5579 <p>The standard doesn't appear to directly address these
5580 questions. The standard needs to be clarified. At least two real-world
5581 cases have been reported where library implementors wasted
5582 considerable effort because of the lack of clarity in the
5583 standard. The question is important because requiring pointers and
5584 references to remain valid has the effect for practical purposes of
5585 prohibiting iterators from pointing to cached rather than actual
5586 elements of containers.</p>
5588 <p>The standard itself assumes that pointers and references obtained
5589 from an iterator are still valid after iterator destruction or
5590 change. The definition of reverse_iterator::operator*(), 24.4.1.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.op.star"> [lib.reverse.iter.op.star]</a>, which returns a reference, defines
5591 effects:</p>
5593 <blockquote>
5594 <pre>Iterator tmp = current;
5595 return *--tmp;</pre>
5596 </blockquote>
5597 <p>The definition of reverse_iterator::operator-&gt;(), 24.4.1.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.opref"> [lib.reverse.iter.opref]</a>, which returns a pointer, defines effects:</p>
5598 <blockquote>
5599 <pre>return &amp;(operator*());</pre>
5600 </blockquote>
5602 <p>Because the standard itself assumes pointers and references remain
5603 valid after iterator destruction or change, the standard should say so
5604 explicitly. This will also reduce the chance of user code breaking
5605 unexpectedly when porting to a different standard library
5606 implementation.</p>
5607 <p><b>Proposed resolution:</b></p>
5608 <p>Add a new paragraph to 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>:</p>
5609 <blockquote>
5610 Destruction of an iterator may invalidate pointers and references
5611 previously obtained from that iterator.
5612 </blockquote>
5614 <p>Replace paragraph 1 of 24.4.1.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.op.star"> [lib.reverse.iter.op.star]</a> with:</p>
5616 <blockquote>
5617 <p><b>Effects:</b></p>
5618 <pre> this-&gt;tmp = current;
5619 --this-&gt;tmp;
5620 return *this-&gt;tmp;
5621 </pre>
5624 [<i>Note:</i> This operation must use an auxiliary member variable,
5625 rather than a temporary variable, to avoid returning a reference that
5626 persists beyond the lifetime of its associated iterator. (See
5627 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>.) The name of this member variable is shown for
5628 exposition only. <i>--end note</i>]
5629 </p>
5630 </blockquote>
5632 <p><i>[Post-Tokyo: The issue has been reformulated purely
5633 in terms of iterators.]</i></p>
5635 <p><i>[Pre-Toronto: Steve Cleary pointed out the no-invalidation
5636 assumption by reverse_iterator. The issue and proposed resolution was
5637 reformulated yet again to reflect this reality.]</i></p>
5639 <p><i>[Copenhagen: Steve Cleary pointed out that reverse_iterator
5640 assumes its underlying iterator has persistent pointers and
5641 references. Andy Koenig pointed out that it is possible to rewrite
5642 reverse_iterator so that it no longer makes such an assupmption.
5643 However, this issue is related to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a>. If we
5644 decide it is intentional that <tt>p[n]</tt> may return by value
5645 instead of reference when <tt>p</tt> is a Random Access Iterator,
5646 other changes in reverse_iterator will be necessary.]</i></p>
5647 <p><b>Rationale:</b></p>
5648 <p>This issue has been discussed extensively. Note that it is
5649 <i>not</i> an issue about the behavior of predefined iterators. It is
5650 asking whether or not user-defined iterators are permitted to have
5651 transient pointers and references. Several people presented examples
5652 of useful user-defined iterators that have such a property; examples
5653 include a B-tree iterator, and an "iota iterator" that doesn't point
5654 to memory. Library implementors already seem to be able to cope with
5655 such iterators: they take pains to avoid forming references to memory
5656 that gets iterated past. The only place where this is a problem is
5657 <tt>reverse_iterator</tt>, so this issue changes
5658 <tt>reverse_iterator</tt> to make it work.</p>
5660 <p>This resolution does not weaken any guarantees provided by
5661 predefined iterators like <tt>list&lt;int&gt;::iterator</tt>.
5662 Clause 23 should be reviewed to make sure that guarantees for
5663 predefined iterators are as strong as users expect.</p>
5665 <hr>
5666 <a name="199"><h3>199.&nbsp;What does <tt>allocate(0)</tt> return?</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;19 Nov 1999</p>
5668 Suppose that <tt>A</tt> is a class that conforms to the
5669 Allocator requirements of Table 32, and <tt>a</tt> is an
5670 object of class <tt>A</tt> What should be the return
5671 value of <tt>a.allocate(0)</tt>? Three reasonable
5672 possibilities: forbid the argument <tt>0</tt>, return
5673 a null pointer, or require that the return value be a
5674 unique non-null pointer.
5675 </p>
5676 <p><b>Proposed resolution:</b></p>
5678 Add a note to the <tt>allocate</tt> row of Table 32:
5679 "[<i>Note:</i> If <tt>n == 0</tt>, the return value is unspecified. <i>--end note</i>]"</p>
5680 <p><b>Rationale:</b></p>
5681 <p>A key to understanding this issue is that the ultimate use of
5682 allocate() is to construct an iterator, and that iterator for zero
5683 length sequences must be the container's past-the-end
5684 representation. Since this already implies special case code, it
5685 would be over-specification to mandate the return value.
5686 </p>
5687 <hr>
5688 <a name="200"><h3>200.&nbsp;Forward iterator requirements don't allow constant iterators</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;19 Nov 1999</p>
5690 In table 74, the return type of the expression <tt>*a</tt> is given
5691 as <tt>T&amp;</tt>, where <tt>T</tt> is the iterator's value type.
5692 For constant iterators, however, this is wrong. ("Value type"
5693 is never defined very precisely, but it is clear that the value type
5694 of, say, <tt>std::list&lt;int&gt;::const_iterator</tt> is supposed to be
5695 <tt>int</tt>, not <tt>const int</tt>.)
5696 </p>
5697 <p><b>Proposed resolution:</b></p>
5699 In table 74, in the <tt>*a</tt> and <tt>*r++</tt> rows, change the
5700 return type from "<tt>T&amp;</tt>" to "<tt>T&amp;</tt>
5701 if <tt>X</tt> is mutable, otherwise <tt>const T&amp;</tt>".
5702 In the <tt>a-&gt;m</tt> row, change the return type from
5703 "<tt>U&amp;</tt>" to "<tt>U&amp;</tt> if <tt>X</tt> is mutable,
5704 otherwise <tt>const U&amp;</tt>".
5705 </p>
5707 <p><i>[Tokyo: The LWG believes this is the tip of a larger iceberg;
5708 there are multiple const problems with the STL portion of the library
5709 and that these should be addressed as a single package.&nbsp; Note
5710 that issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#180">180</a> has already been declared NAD Future for
5711 that very reason.]</i></p>
5713 <p><i>[Redmond: the LWG thinks this is separable from other constness
5714 issues. This issue is just cleanup; it clarifies language that was
5715 written before we had iterator_traits. Proposed resolution was
5716 modified: the original version only discussed *a. It was pointed out
5717 that we also need to worry about *r++ and a-&gt;m.]</i></p>
5719 <hr>
5720 <a name="202"><h3>202.&nbsp;unique() effects unclear when predicate not an equivalence relation</h3></a><p><b>Section:</b>&nbsp;25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andrew Koenig&nbsp; <b>Date:</b>&nbsp;13 Jan 2000</p>
5722 What should unique() do if you give it a predicate that is not an
5723 equivalence relation? There are at least two plausible answers:
5724 </p>
5726 <blockquote>
5729 1. You can't, because 25.2.8 says that it it "eliminates all but
5730 the first element from every consecutive group of equal
5731 elements..." and it wouldn't make sense to interpret "equal" as
5732 meaning anything but an equivalence relation. [It also doesn't
5733 make sense to interpret "equal" as meaning ==, because then there
5734 would never be any sense in giving a predicate as an argument at
5735 all.]
5736 </p>
5739 2. The word "equal" should be interpreted to mean whatever the
5740 predicate says, even if it is not an equivalence relation
5741 (and in particular, even if it is not transitive).
5742 </p>
5744 </blockquote>
5747 The example that raised this question is from Usenet:
5748 </p>
5750 <blockquote>
5752 <pre>int f[] = { 1, 3, 7, 1, 2 };
5753 int* z = unique(f, f+5, greater&lt;int&gt;());</pre>
5755 </blockquote>
5758 If one blindly applies the definition using the predicate
5759 greater&lt;int&gt;, and ignore the word "equal", you get:
5760 </p>
5762 <blockquote>
5765 Eliminates all but the first element from every consecutive group
5766 of elements referred to by the iterator i in the range [first, last)
5767 for which *i &gt; *(i - 1).
5768 </p>
5770 </blockquote>
5773 The first surprise is the order of the comparison. If we wanted to
5774 allow for the predicate not being an equivalence relation, then we
5775 should surely compare elements the other way: pred(*(i - 1), *i). If
5776 we do that, then the description would seem to say: "Break the
5777 sequence into subsequences whose elements are in strictly increasing
5778 order, and keep only the first element of each subsequence". So the
5779 result would be 1, 1, 2. If we take the description at its word, it
5780 would seem to call for strictly DEcreasing order, in which case the
5781 result should be 1, 3, 7, 2.<br>
5782 <br>
5783 In fact, the SGI implementation of unique() does neither: It yields 1,
5784 3, 7.
5785 </p>
5786 <p><b>Proposed resolution:</b></p>
5787 <p>Change 25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a> paragraph 1 to:</p>
5788 <blockquote>
5789 For a nonempty range, eliminates all but the first element from every
5790 consecutive group of equivalent elements referred to by the iterator
5791 <tt>i</tt> in the range [first+1, last) for which the following
5792 conditions hold: <tt>*(i-1) == *i</tt> or <tt>pred(*(i-1), *i) !=
5793 false</tt>.
5794 </blockquote>
5797 Also insert a new paragraph, paragraph 2a, that reads: "Requires: The
5798 comparison function must be an equivalence relation."
5799 </p>
5801 <p><i>[Redmond: discussed arguments for and against requiring the
5802 comparison function to be an equivalence relation. Straw poll:
5803 14-2-5. First number is to require that it be an equivalence
5804 relation, second number is to explicitly not require that it be an
5805 equivalence relation, third number is people who believe they need
5806 more time to consider the issue. A separate issue: Andy Sawyer
5807 pointed out that "i-1" is incorrect, since "i" can refer to the first
5808 iterator in the range. Matt provided wording to address this
5809 problem.]</i></p>
5811 <p><i>[Curaçao: The LWG changed "... the range (first,
5812 last)..." to "... the range [first+1, last)..." for
5813 clarity. They considered this change close enough to editorial to not
5814 require another round of review.]</i></p>
5816 <p><b>Rationale:</b></p>
5817 <p>The LWG also considered an alternative resolution: change
5818 25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a> paragraph 1 to:</p>
5820 <blockquote>
5821 For a nonempty range, eliminates all but the first element from every
5822 consecutive group of elements referred to by the iterator
5823 <tt>i</tt> in the range (first, last) for which the following
5824 conditions hold: <tt>*(i-1) == *i</tt> or <tt>pred(*(i-1), *i) !=
5825 false</tt>.
5826 </blockquote>
5829 Also insert a new paragraph, paragraph 1a, that reads: "Notes: The
5830 comparison function need not be an equivalence relation."
5831 </p>
5834 <p>Informally: the proposed resolution imposes an explicit requirement
5835 that the comparison function be an equivalence relation. The
5836 alternative resolution does not, and it gives enough information so
5837 that the behavior of unique() for a non-equivalence relation is
5838 specified. Both resolutions are consistent with the behavior of
5839 existing implementations.</p>
5840 <hr>
5841 <a name="208"><h3>208.&nbsp;Unnecessary restriction on past-the-end iterators</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Stephen Cleary&nbsp; <b>Date:</b>&nbsp;02 Feb 2000</p>
5842 <p>In 24.1 paragraph 5, it is stated ". . . Dereferenceable and
5843 past-the-end values are always non-singular."</p>
5844 <p>This places an unnecessary restriction on past-the-end iterators for
5845 containers with forward iterators (for example, a singly-linked list). If the
5846 past-the-end value on such a container was a well-known singular value, it would
5847 still satisfy all forward iterator requirements.</p>
5848 <p>Removing this restriction would allow, for example, a singly-linked list
5849 without a "footer" node.</p>
5850 <p>This would have an impact on existing code that expects past-the-end
5851 iterators obtained from different (generic) containers being not equal.</p>
5852 <p><b>Proposed resolution:</b></p>
5853 <p>Change 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a> paragraph 5, the last sentence, from:</p>
5854 <blockquote>
5855 <p>Dereferenceable and past-the-end values are always non-singular.</p>
5856 </blockquote>
5857 <p>to:</p>
5858 <blockquote>
5859 <p>Dereferenceable values are always non-singular.&nbsp;</p>
5860 </blockquote>
5861 <p><b>Rationale:</b></p>
5862 <p>For some kinds of containers, including singly linked lists and
5863 zero-length vectors, null pointers are perfectly reasonable past-the-end
5864 iterators. Null pointers are singular.
5865 </p>
5866 <hr>
5867 <a name="209"><h3>209.&nbsp;basic_string declarations inconsistent</h3></a><p><b>Section:</b>&nbsp;21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Igor Stauder&nbsp; <b>Date:</b>&nbsp;11 Feb 2000</p>
5868 <p>In Section 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a> the basic_string member function
5869 declarations use a consistent style except for the following functions:</p>
5870 <blockquote>
5871 <pre>void push_back(const charT);
5872 basic_string&amp; assign(const basic_string&amp;);
5873 void swap(basic_string&lt;charT,traits,Allocator&gt;&amp;);</pre>
5874 </blockquote>
5875 <p>- push_back, assign, swap: missing argument name&nbsp;<br>
5876 - push_back: use of const with charT (i.e. POD type passed by value
5877 not by reference - should be charT or const charT&amp; )<br>
5878 - swap: redundant use of template parameters in argument
5879 basic_string&lt;charT,traits,Allocator&gt;&amp;</p>
5880 <p><b>Proposed resolution:</b></p>
5881 <p>In Section 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a> change the basic_string member
5882 function declarations push_back, assign, and swap to:</p>
5883 <blockquote>
5884 <pre>void push_back(charT c);
5886 basic_string&amp; assign(const basic_string&amp; str);
5887 void swap(basic_string&amp; str);</pre>
5888 </blockquote>
5889 <p><b>Rationale:</b></p>
5890 <p>Although the standard is in general not consistent in declaration
5891 style, the basic_string declarations are consistent other than the
5892 above. The LWG felt that this was sufficient reason to merit the
5893 change.
5894 </p>
5895 <hr>
5896 <a name="210"><h3>210.&nbsp;distance first and last confused</h3></a><p><b>Section:</b>&nbsp;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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Lisa Lippincott&nbsp; <b>Date:</b>&nbsp;15 Feb 2000</p>
5897 <p>In paragraph 9 of section 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a>, it is written:</p>
5898 <blockquote>
5899 <p> In the description of the algorithms operators + and - are used
5900 for some of the iterator categories for which they do not have to
5901 be defined. In these cases the semantics of [...] a-b is the same
5902 as of<br>
5903 <br>
5904 &nbsp;&nbsp;&nbsp;&nbsp; <tt>return distance(a, b);</tt></p>
5905 </blockquote>
5906 <p><b>Proposed resolution:</b></p>
5907 <p>On the last line of paragraph 9 of section 25 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.algorithms"> [lib.algorithms]</a> change
5908 <tt>"a-b"</tt> to <tt>"b-a".</tt></p>
5909 <p><b>Rationale:</b></p>
5910 <p>There are two ways to fix the defect; change the description to b-a
5911 or change the return to distance(b,a). The LWG preferred the
5912 former for consistency.</p>
5913 <hr>
5914 <a name="211"><h3>211.&nbsp;operator&gt;&gt;(istream&amp;, string&amp;) doesn't set failbit</h3></a><p><b>Section:</b>&nbsp;21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Scott Snyder&nbsp; <b>Date:</b>&nbsp;4 Feb 2000</p>
5915 <p>The description of the stream extraction operator for std::string (section
5916 21.3.7.9 [lib.string.io]) does not contain a requirement that failbit be set in
5917 the case that the operator fails to extract any characters from the input
5918 stream.</p>
5919 <p>This implies that the typical construction</p>
5920 <blockquote>
5921 <pre>std::istream is;
5922 std::string str;
5924 while (is &gt;&gt; str) ... ;</pre>
5925 </blockquote>
5926 <p>(which tests failbit) is not required to terminate at EOF.</p>
5927 <p>Furthermore, this is inconsistent with other extraction operators,
5928 which do include this requirement. (See sections 27.6.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted"> [lib.istream.formatted]</a> and 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>), where this
5929 requirement is present, either explicitly or implicitly, for the
5930 extraction operators. It is also present explicitly in the description
5931 of getline (istream&amp;, string&amp;, charT) in section 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a> paragraph 8.)</p>
5932 <p><b>Proposed resolution:</b></p>
5933 <p>Insert new paragraph after paragraph 2 in section 21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>:</p>
5934 <blockquote>
5936 <p>If the function extracts no characters, it calls
5937 is.setstate(ios::failbit) which may throw ios_base::failure
5938 (27.4.4.3).</p>
5939 </blockquote>
5940 <hr>
5941 <a name="212"><h3>212.&nbsp;Empty range behavior unclear for several algorithms</h3></a><p><b>Section:</b>&nbsp;25.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.min.max"> [lib.alg.min.max]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Nico Josuttis&nbsp; <b>Date:</b>&nbsp;26 Feb 2000</p>
5942 <p>The standard doesn't specify what min_element() and max_element() shall
5943 return if the range is empty (first equals last). The usual implementations
5944 return last. This problem seems also apply to partition(), stable_partition(),
5945 next_permutation(), and prev_permutation().</p>
5946 <p><b>Proposed resolution:</b></p>
5947 <p>In 25.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.min.max"> [lib.alg.min.max]</a> - Minimum and maximum, paragraphs 7 and
5948 9, append: Returns last if first==last.</p>
5949 <p><b>Rationale:</b></p>
5950 <p>The LWG looked in some detail at all of the above mentioned
5951 algorithms, but believes that except for min_element() and
5952 max_element() it is already clear that last is returned if first ==
5953 last.</p>
5954 <hr>
5955 <a name="214"><h3>214.&nbsp;set::find() missing const overload</h3></a><p><b>Section:</b>&nbsp;23.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.set"> [lib.set]</a>, 23.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.multiset"> [lib.multiset]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;28 Feb 2000</p>
5956 <p>The specification for the associative container requirements in
5957 Table 69 state that the find member function should "return
5958 iterator; const_iterator for constant a". The map and multimap
5959 container descriptions have two overloaded versions of find, but set
5960 and multiset do not, all they have is:</p>
5961 <blockquote>
5962 <pre>iterator find(const key_type &amp; x) const;</pre>
5963 </blockquote>
5964 <p><b>Proposed resolution:</b></p>
5965 <p>Change the prototypes for find(), lower_bound(), upper_bound(), and
5966 equal_range() in section 23.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.set"> [lib.set]</a> and section 23.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.multiset"> [lib.multiset]</a> to each have two overloads:</p>
5967 <blockquote>
5968 <pre>iterator find(const key_type &amp; x);
5969 const_iterator find(const key_type &amp; x) const;</pre>
5970 <pre>iterator lower_bound(const key_type &amp; x);
5971 const_iterator lower_bound(const key_type &amp; x) const;</pre>
5972 <pre>iterator upper_bound(const key_type &amp; x);
5973 const_iterator upper_bound(const key_type &amp; x) const;</pre>
5974 <pre>pair&lt;iterator, iterator&gt; equal_range(const key_type &amp; x);
5975 pair&lt;const_iterator, const_iterator&gt; equal_range(const key_type &amp; x) const;</pre>
5976 </blockquote>
5978 <p><i>[Tokyo: At the request of the LWG, Judy Ward provided wording
5979 extending the proposed resolution to lower_bound, upper_bound, and
5980 equal_range.]</i></p>
5981 <hr>
5982 <a name="217"><h3>217.&nbsp;Facets example (Classifying Japanese characters) contains errors</h3></a><p><b>Section:</b>&nbsp;22.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facets.examples"> [lib.facets.examples]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;29 Feb 2000</p>
5983 <p>The example in 22.2.8, paragraph 11 contains the following errors:</p>
5984 <p>1) The member function `My::JCtype::is_kanji()' is non-const; the function
5985 must be const in order for it to be callable on a const object (a reference to
5986 which which is what std::use_facet&lt;&gt;() returns).</p>
5987 <p>2) In file filt.C, the definition of `JCtype::id' must be qualified with the
5988 name of the namespace `My'.</p>
5989 <p>3) In the definition of `loc' and subsequently in the call to use_facet&lt;&gt;()
5990 in main(), the name of the facet is misspelled: it should read `My::JCtype'
5991 rather than `My::JCType'.</p>
5992 <p><b>Proposed resolution:</b></p>
5993 <p>Replace the "Classifying Japanese characters" example in 22.2.8,
5994 paragraph 11 with the following:</p>
5995 <pre>#include &lt;locale&gt;</pre>
5996 <pre>namespace My {
5997 using namespace std;
5998 class JCtype : public locale::facet {
5999 public:
6000 static locale::id id; // required for use as a new locale facet
6001 bool is_kanji (wchar_t c) const;
6002 JCtype() {}
6003 protected:
6004 ~JCtype() {}
6006 }</pre>
6007 <pre>// file: filt.C
6008 #include &lt;iostream&gt;
6009 #include &lt;locale&gt;
6010 #include "jctype" // above
6011 std::locale::id My::JCtype::id; // the static JCtype member
6012 declared above.</pre>
6013 <pre>int main()
6015 using namespace std;
6016 typedef ctype&lt;wchar_t&gt; wctype;
6017 locale loc(locale(""), // the user's preferred locale...
6018 new My::JCtype); // and a new feature ...
6019 wchar_t c = use_facet&lt;wctype&gt;(loc).widen('!');
6020 if (!use_facet&lt;My::JCtype&gt;(loc).is_kanji(c))
6021 cout &lt;&lt; "no it isn't!" &lt;&lt; endl;
6022 return 0;
6023 }</pre>
6024 <hr>
6025 <a name="220"><h3>220.&nbsp;~ios_base() usage valid?</h3></a><p><b>Section:</b>&nbsp;27.4.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios.base.cons"> [lib.ios.base.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Jonathan Schilling, Howard Hinnant&nbsp; <b>Date:</b>&nbsp;13 Mar 2000</p>
6026 <p>The pre-conditions for the ios_base destructor are described in 27.4.2.7
6027 paragraph 2:</p>
6028 <blockquote>
6029 <p>Effects: Destroys an object of class ios_base. Calls each registered
6030 callback pair (fn,index) (27.4.2.6) as (*fn)(erase_event,*this,index) at such
6031 time that any ios_base member function called from within fn has well defined
6032 results.</p>
6033 </blockquote>
6034 <p>But what is not clear is: If no callback functions were ever registered, does
6035 it matter whether the ios_base members were ever initialized?</p>
6036 <p>For instance, does this program have defined behavior:</p>
6037 <blockquote>
6038 <pre>#include &lt;ios&gt;</pre>
6039 <pre>class D : public std::ios_base { };</pre>
6040 <pre>int main() { D d; }</pre>
6041 </blockquote>
6042 <p>It seems that registration of a callback function would surely affect the
6043 state of an ios_base. That is, when you register a callback function with an
6044 ios_base, the ios_base must record that fact somehow.</p>
6045 <p>But if after construction the ios_base is in an indeterminate state, and that
6046 state is not made determinate before the destructor is called, then how would
6047 the destructor know if any callbacks had indeed been registered? And if the
6048 number of callbacks that had been registered is indeterminate, then is not the
6049 behavior of the destructor undefined?</p>
6050 <p>By comparison, the basic_ios class description in 27.4.4.1 paragraph 2 makes
6051 it explicit that destruction before initialization results in undefined
6052 behavior.</p>
6053 <p><b>Proposed resolution:</b></p>
6054 <p>Modify 27.4.2.7 paragraph 1 from</p>
6055 <blockquote>
6056 <p>Effects: Each ios_base member has an indeterminate value after
6057 construction.</p>
6058 </blockquote>
6059 <p>to</p>
6060 <blockquote>
6061 <p>Effects: Each ios_base member has an indeterminate
6062 value after construction. These members must be initialized by calling
6063 basic_ios::init. If an ios_base object is destroyed before these
6064 initializations have taken place, the behavior is undefined.</p>
6065 </blockquote>
6066 <hr>
6067 <a name="221"><h3>221.&nbsp;num_get&lt;&gt;::do_get stage 2 processing broken</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;14 Mar 2000</p>
6068 <p>Stage 2 processing of numeric conversion is broken.</p>
6070 <p>Table 55 in 22.2.2.1.2 says that when basefield is 0 the integral
6071 conversion specifier is %i. A %i specifier determines a number's base
6072 by its prefix (0 for octal, 0x for hex), so the intention is clearly
6073 that a 0x prefix is allowed. Paragraph 8 in the same section,
6074 however, describes very precisely how characters are processed. (It
6075 must be done "as if" by a specified code fragment.) That
6076 description does not allow a 0x prefix to be recognized.</p>
6078 <p>Very roughly, stage 2 processing reads a char_type ct. It converts
6079 ct to a char, not by using narrow but by looking it up in a
6080 translation table that was created by widening the string literal
6081 "0123456789abcdefABCDEF+-". The character "x" is
6082 not found in that table, so it can't be recognized by stage 2
6083 processing.</p>
6084 <p><b>Proposed resolution:</b></p>
6085 <p>In 22.2.2.1.2 paragraph 8, replace the line:</p>
6086 <blockquote>
6087 <pre>static const char src[] = "0123456789abcdefABCDEF+-";</pre>
6088 </blockquote>
6089 <p>with the line:</p>
6090 <blockquote>
6091 <pre>static const char src[] = "0123456789abcdefxABCDEFX+-";</pre>
6092 </blockquote>
6093 <p><b>Rationale:</b></p>
6094 <p>If we're using the technique of widening a string literal, the
6095 string literal must contain every character we wish to recognize.
6096 This technique has the consequence that alternate representations
6097 of digits will not be recognized. This design decision was made
6098 deliberately, with full knowledge of that limitation.</p>
6099 <hr>
6100 <a name="222"><h3>222.&nbsp;Are throw clauses necessary if a throw is already implied by the effects clause?</h3></a><p><b>Section:</b>&nbsp;17.3.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.structure.specifications"> [lib.structure.specifications]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;17 Mar 2000</p>
6101 <p>Section 21.3.6.8 describes the basic_string::compare function this way:</p>
6102 <blockquote>
6103 <pre>21.3.6.8 - basic_string::compare [lib.string::compare]
6105 int compare(size_type pos1, size_type n1,
6106 const basic_string&lt;charT,traits,Allocator&gt;&amp; str ,
6107 size_type pos2 , size_type n2 ) const;
6109 -4- Returns:
6111 basic_string&lt;charT,traits,Allocator&gt;(*this,pos1,n1).compare(
6112 basic_string&lt;charT,traits,Allocator&gt;(str,pos2,n2)) .</pre>
6113 </blockquote>
6114 <p>and the constructor that's implicitly called by the above is
6115 defined to throw an out-of-range exception if pos &gt; str.size(). See
6116 section 21.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.cons"> [lib.string.cons]</a> paragraph 4.</p>
6118 <p>On the other hand, the compare function descriptions themselves don't have
6119 "Throws: " clauses and according to 17.3.1.3, paragraph 3, elements
6120 that do not apply to a function are omitted.</p>
6121 <p>So it seems there is an inconsistency in the standard -- are the
6122 "Effects" clauses correct, or are the "Throws" clauses
6123 missing?</p>
6124 <p><b>Proposed resolution:</b></p>
6125 <p>In 17.3.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.structure.specifications"> [lib.structure.specifications]</a> paragraph 3, the footnote 148 attached to
6126 the sentence "Descriptions of function semantics contain the
6127 following elements (as appropriate):", insert the word
6128 "further" so that the foot note reads:</p>
6129 <blockquote>
6130 <p>To save space, items that do not apply to a function are
6131 omitted. For example, if a function does not specify any further
6132 preconditions, there will be no "Requires" paragraph.</p>
6133 </blockquote>
6134 <p><b>Rationale:</b></p>
6135 <p>The standard is somewhat inconsistent, but a failure to note a
6136 throw condition in a throws clause does not grant permission not to
6137 throw. The inconsistent wording is in a footnote, and thus
6138 non-normative. The proposed resolution from the LWG clarifies the
6139 footnote.</p>
6140 <hr>
6141 <a name="223"><h3>223.&nbsp;reverse algorithm should use iter_swap rather than swap</h3></a><p><b>Section:</b>&nbsp;25.2.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.reverse"> [lib.alg.reverse]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;21 Mar 2000</p>
6142 <p>Shouldn't the effects say "applies iter_swap to all pairs..."?</p>
6143 <p><b>Proposed resolution:</b></p>
6144 <p>In 25.2.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.reverse"> [lib.alg.reverse]</a>, replace:</p>
6145 <blockquote>
6146 Effects: For each non-negative integer i &lt;= (last - first)/2,
6147 applies swap to all pairs of iterators first + i, (last - i) - 1.
6148 </blockquote>
6149 <p>with:</p>
6150 <blockquote>
6151 Effects: For each non-negative integer i &lt;= (last - first)/2,
6152 applies iter_swap to all pairs of iterators first + i, (last - i) - 1.
6153 </blockquote>
6154 <hr>
6155 <a name="224"><h3>224.&nbsp;clear() complexity for associative containers refers to undefined N</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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Ed Brey&nbsp; <b>Date:</b>&nbsp;23 Mar 2000</p>
6156 <p>In the associative container requirements table in 23.1.2 paragraph 7,
6157 a.clear() has complexity "log(size()) + N". However, the meaning of N
6158 is not defined.</p>
6159 <p><b>Proposed resolution:</b></p>
6160 <p>In the associative container requirements table in 23.1.2 paragraph
6161 7, the complexity of a.clear(), change "log(size()) + N" to
6162 "linear in <tt>size()</tt>".</p>
6163 <p><b>Rationale:</b></p>
6164 <p>It's the "log(size())", not the "N", that is in
6165 error: there's no difference between <i>O(N)</i> and <i>O(N +
6166 log(N))</i>. The text in the standard is probably an incorrect
6167 cut-and-paste from the range version of <tt>erase</tt>.</p>
6168 <hr>
6169 <a name="225"><h3>225.&nbsp;std:: algorithms use of other unqualified algorithms</h3></a><p><b>Section:</b>&nbsp;17.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.global.functions"> [lib.global.functions]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;01 Apr 2000</p>
6170 <p>Are algorithms in std:: allowed to use other algorithms without qualification, so functions in
6171 user namespaces might be found through Koenig lookup?</p>
6172 <p>For example, a popular standard library implementation includes this
6173 implementation of std::unique:</p>
6174 <blockquote>
6175 <pre>namespace std {
6176 template &lt;class _ForwardIter&gt;
6177 _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
6178 __first = adjacent_find(__first, __last);
6179 return unique_copy(__first, __last, __first);
6181 }</pre>
6182 </blockquote>
6183 <p>Imagine two users on opposite sides of town, each using unique on his own
6184 sequences bounded by my_iterators . User1 looks at his standard library
6185 implementation and says, "I know how to implement a more efficient
6186 unique_copy for my_iterators", and writes:</p>
6187 <blockquote>
6188 <pre>namespace user1 {
6189 class my_iterator;
6190 // faster version for my_iterator
6191 my_iterator unique_copy(my_iterator, my_iterator, my_iterator);
6192 }</pre>
6193 </blockquote>
6194 <p>user1::unique_copy() is selected by Koenig lookup, as he intended.</p>
6195 <p>User2 has other needs, and writes:</p>
6196 <blockquote>
6197 <pre>namespace user2 {
6198 class my_iterator;
6199 // Returns true iff *c is a unique copy of *a and *b.
6200 bool unique_copy(my_iterator a, my_iterator b, my_iterator c);
6201 }</pre>
6202 </blockquote>
6203 <p>User2 is shocked to find later that his fully-qualified use of
6204 std::unique(user2::my_iterator, user2::my_iterator, user2::my_iterator) fails to
6205 compile (if he's lucky). Looking in the standard, he sees the following Effects
6206 clause for unique():</p>
6207 <blockquote>
6208 <p>Effects: Eliminates all but the first element from every consecutive group
6209 of equal elements referred to by the iterator i in the range [first, last) for
6210 which the following corresponding conditions hold: *i == *(i - 1) or pred(*i,
6211 *(i - 1)) != false</p>
6212 </blockquote>
6213 <p>The standard gives user2 absolutely no reason to think he can interfere with
6214 std::unique by defining names in namespace user2. His standard library has been
6215 built with the template export feature, so he is unable to inspect the
6216 implementation. User1 eventually compiles his code with another compiler, and
6217 his version of unique_copy silently stops being called. Eventually, he realizes
6218 that he was depending on an implementation detail of his library and had no
6219 right to expect his unique_copy() to be called portably.</p>
6220 <p>On the face of it, and given above scenario, it may seem obvious that the
6221 implementation of unique() shown is non-conforming because it uses unique_copy()
6222 rather than ::std::unique_copy(). Most standard library implementations,
6223 however, seem to disagree with this notion.</p>
6224 <p> <i>[Tokyo:&nbsp; Steve Adamczyk from
6225 the core working group indicates that "std::" is sufficient;&nbsp;
6226 leading "::" qualification is not required because any namespace
6227 qualification is sufficient to suppress Koenig lookup.]</i></p>
6228 <p><b>Proposed resolution:</b></p>
6229 <p>Add a paragraph and a note at the end of
6230 17.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.global.functions"> [lib.global.functions]</a>:</p>
6231 <blockquote>
6233 <p>Unless otherwise specified, no global or non-member function in the
6234 standard library shall use a function from another namespace which is
6235 found through <i>argument-dependent name lookup</i> (3.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/basic.html#basic.lookup.koenig"> [basic.lookup.koenig]</a>).</p>
6237 <p>[Note: the phrase "unless otherwise specified" is intended to
6238 allow Koenig lookup in cases like that of ostream_iterators:<br>
6240 <br>
6241 Effects:</p>
6242 <blockquote>
6243 <p>*out_stream &lt;&lt; value;<br>
6244 if(delim != 0) *out_stream &lt;&lt; delim;<br>
6245 return (*this);</p>
6246 <p>--end note]</p>
6247 </blockquote>
6248 </blockquote>
6250 <p><i>[Tokyo: The LWG agrees that this is a defect in the standard, but
6251 is as yet unsure if the proposed resolution is the best
6252 solution. Furthermore, the LWG believes that the same problem of
6253 unqualified library names applies to wording in the standard itself,
6254 and has opened issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#229">229</a> accordingly. Any resolution of
6255 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a> should be coordinated with the resolution of
6256 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#229">229</a>.]</i></p>
6258 <p><i>[Toronto: The LWG is not sure if this is a defect in the
6259 standard. Most LWG members believe that an implementation of
6260 <tt>std::unique</tt> like the one quoted in this issue is already
6261 illegal, since, under certain circumstances, its semantics are not
6262 those specified in the standard. The standard's description of
6263 <tt>unique</tt> does not say that overloading <tt>adjacent_find</tt>
6264 should have any effect.]</i></p>
6266 <p><i>[Curaçao: An LWG-subgroup spent an afternoon working on issues
6267 225, 226, and 229. Their conclusion was that the issues should be
6268 separated into an LWG portion (Howard's paper, N1387=02-0045), and a
6269 EWG portion (Dave will write a proposal). The LWG and EWG had
6270 (separate) discussions of this plan the next day. The proposed
6271 resolution for this issue is in accordance with Howard's paper.]</i></p>
6273 <p><b>Rationale:</b></p>
6274 <p>It could be argued that this proposed isn't strictly necessary,
6275 that the Standard doesn't grant implementors license to write a
6276 standard function that behaves differently than specified in the
6277 Standard just because of an unrelated user-defined name in some
6278 other namespace. However, this is at worst a clarification. It is
6279 surely right that algorithsm shouldn't pick up random names, that
6280 user-defined names should have no effect unless otherwise specified.
6281 Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#226">226</a> deals with the question of when it is
6282 appropriate for the standard to explicitly specify otherwise.</p>
6283 <hr>
6284 <a name="226"><h3>226.&nbsp;User supplied specializations or overloads of namespace std function 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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;01 Apr 2000</p>
6285 <p>The issues are:&nbsp;</p>
6286 <p>1. How can a 3rd party library implementor (lib1) write a version of a standard
6287 algorithm which is specialized to work with his own class template?&nbsp;</p>
6288 <p>2. How can another library implementor (lib2) write a generic algorithm which
6289 will take advantage of the specialized algorithm in lib1?</p>
6290 <p>This appears to be the only viable answer under current language rules:</p>
6291 <blockquote>
6292 <pre>namespace lib1
6294 // arbitrary-precision numbers using T as a basic unit
6295 template &lt;class T&gt;
6296 class big_num { //...
6298 </pre>
6299 <pre> // defining this in namespace std is illegal (it would be an
6300 // overload), so we hope users will rely on Koenig lookup
6301 template &lt;class T&gt;
6302 void swap(big_int&lt;T&gt;&amp;, big_int&lt;T&gt;&amp;);
6303 }</pre>
6304 <pre>#include &lt;algorithm&gt;
6305 namespace lib2
6307 template &lt;class T&gt;
6308 void generic_sort(T* start, T* end)
6311 // using-declaration required so we can work on built-in types
6312 using std::swap;
6313 // use Koenig lookup to find specialized algorithm if available
6314 swap(*x, *y);
6316 }</pre>
6317 </blockquote>
6318 <p>This answer has some drawbacks. First of all, it makes writing lib2 difficult
6319 and somewhat slippery. The implementor needs to remember to write the
6320 using-declaration, or generic_sort will fail to compile when T is a built-in
6321 type. The second drawback is that the use of this style in lib2 effectively
6322 "reserves" names in any namespace which defines types which may
6323 eventually be used with lib2. This may seem innocuous at first when applied to
6324 names like swap, but consider more ambiguous names like unique_copy() instead.
6325 It is easy to imagine the user wanting to define these names differently in his
6326 own namespace. A definition with semantics incompatible with the standard
6327 library could cause serious problems (see issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a>).</p>
6328 <p>Why, you may ask, can't we just partially specialize std::swap()? It's
6329 because the language doesn't allow for partial specialization of function
6330 templates. If you write:</p>
6331 <blockquote>
6332 <pre>namespace std
6334 template &lt;class T&gt;
6335 void swap(lib1::big_int&lt;T&gt;&amp;, lib1::big_int&lt;T&gt;&amp;);
6336 }</pre>
6337 </blockquote>
6338 <p>You have just overloaded std::swap, which is illegal under the current
6339 language rules. On the other hand, the following full specialization is legal:</p>
6340 <blockquote>
6341 <pre>namespace std
6343 template &lt;&gt;
6344 void swap(lib1::other_type&amp;, lib1::other_type&amp;);
6345 }</pre>
6346 </blockquote>
6348 <p>This issue reflects concerns raised by the "Namespace issue
6349 with specialized swap" thread on comp.lang.c++.moderated. A
6350 similar set of concerns was earlier raised on the boost.org mailing
6351 list and the ACCU-general mailing list. Also see library reflector
6352 message c++std-lib-7354.</p>
6355 J. C. van Winkel points out (in c++std-lib-9565) another unexpected
6356 fact: it's impossible to output a container of std::pair's using copy
6357 and an ostream_iterator, as long as both pair-members are built-in or
6358 std:: types. That's because a user-defined operator&lt;&lt; for (for
6359 example) std::pair&lt;const std::string, int&gt; will not be found:
6360 lookup for operator&lt;&lt; will be performed only in namespace std.
6361 Opinions differed on whether or not this was a defect, and, if so,
6362 whether the defect is that something is wrong with user-defined
6363 functionality and std, or whether it's that the standard library does
6364 not provide an operator&lt;&lt; for std::pair&lt;&gt;.
6365 </p>
6367 <p><b>Proposed resolution:</b></p>
6369 <p>Adopt the wording proposed in Howard Hinnant's paper
6370 N1523=03-0106, "Proposed Resolution To LWG issues 225, 226, 229".</p>
6373 <p><i>[Tokyo: Summary, "There is no conforming way to extend
6374 std::swap for user defined templates."&nbsp; The LWG agrees that
6375 there is a problem. Would like more information before
6376 proceeding. This may be a core issue. Core issue 229 has been opened
6377 to discuss the core aspects of this problem. It was also noted that
6378 submissions regarding this issue have been received from several
6379 sources, but too late to be integrated into the issues list.
6380 ]</i></p>
6382 <p><i>[Post-Tokyo: A paper with several proposed resolutions,
6383 J16/00-0029==WG21/N1252, "Shades of namespace std functions
6384 " by Alan Griffiths, is in the Post-Tokyo mailing. It
6385 should be considered a part of this issue.]</i></p>
6387 <p><i>[Toronto: Dave Abrahams and Peter Dimov have proposed a
6388 resolution that involves core changes: it would add partial
6389 specialization of function template. The Core Working Group is
6390 reluctant to add partial specialization of function templates. It is
6391 viewed as a large change, CWG believes that proposal presented leaves
6392 some syntactic issues unanswered; if the CWG does add partial
6393 specialization of function templates, it wishes to develop its own
6394 proposal. The LWG continues to believe that there is a serious
6395 problem: there is no good way for users to force the library to use
6396 user specializations of generic standard library functions, and in
6397 certain cases (e.g. transcendental functions called by
6398 <tt>valarray</tt> and <tt>complex</tt>) this is important. Koenig
6399 lookup isn't adequate, since names within the library must be
6400 qualified with <tt>std</tt> (see issue 225), specialization doesn't
6401 work (we don't have partial specialization of function templates), and
6402 users aren't permitted to add overloads within namespace std.
6403 ]</i></p>
6405 <p><i>[Copenhagen: Discussed at length, with no consensus. Relevant
6406 papers in the pre-Copenhagen mailing: N1289, N1295, N1296. Discussion
6407 focused on four options. (1) Relax restrictions on overloads within
6408 namespace std. (2) Mandate that the standard library use unqualified
6409 calls for <tt>swap</tt> and possibly other functions. (3) Introduce
6410 helper class templates for <tt>swap</tt> and possibly other functions.
6411 (4) Introduce partial specialization of function templates. Every
6412 option had both support and opposition. Straw poll (first number is
6413 support, second is strongly opposed): (1) 6, 4; (2) 6, 7; (3) 3, 8;
6414 (4) 4, 4.]</i></p>
6416 <p><i>[Redmond: Discussed, again no consensus. Herb presented an
6417 argument that a user who is defining a type <tt>T</tt> with an
6418 associated <tt>swap</tt> should not be expected to put that
6419 <tt>swap</tt> in namespace std, either by overloading or by partial
6420 specialization. The argument is that <tt>swap</tt> is part of
6421 <tt>T</tt>'s interface, and thus should to in the same namespace as
6422 <tt>T</tt> and only in that namespace. If we accept this argument,
6423 the consequence is that standard library functions should use
6424 unqualified call of <tt>swap</tt>. (And which other functions? Any?)
6425 A small group (Nathan, Howard, Jeremy, Dave, Matt, Walter, Marc) will
6426 try to put together a proposal before the next meeting.]</i></p>
6428 <p><i>[Curaçao: An LWG-subgroup spent an afternoon working on issues
6429 225, 226, and 229. Their conclusion was that the issues should be
6430 separated into an LWG portion (Howard's paper, N1387=02-0045), and a
6431 EWG portion (Dave will write a proposal). The LWG and EWG had
6432 (separate) discussions of this plan the next day. The proposed
6433 resolution is the one proposed by Howard.]</i></p>
6435 <p><i>[Santa Cruz: the LWG agreed with the general direction of
6436 Howard's paper, N1387. (Roughly: Koenig lookup is disabled unless
6437 we say otherwise; this issue is about when we do say otherwise.)
6438 However, there were concerns about wording. Howard will provide new
6439 wording. Bill and Jeremy will review it.]</i></p>
6441 <p><i>[Kona: Howard proposed the new wording. The LWG accepted his
6442 proposed resolution.]</i></p>
6444 <p><b>Rationale:</b></p>
6445 <p>Informally: introduce a Swappable concept, and specify that the
6446 value types of the iterators passed to certain standard algorithms
6447 (such as iter_swap, swap_ranges, reverse, rotate, and sort) conform
6448 to that concept. The Swappable concept will make it clear that
6449 these algorithms use unqualified lookup for the calls
6450 to <tt>swap</tt>. Also, in 26.3.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.transcend"> [lib.valarray.transcend]</a> paragraph 1,
6451 state that the valarray transcendentals use unqualified lookup.</p>
6452 <hr>
6453 <a name="227"><h3>227.&nbsp;std::swap() should require CopyConstructible or DefaultConstructible arguments</h3></a><p><b>Section:</b>&nbsp;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#TC">TC</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;09 Apr 2000</p>
6454 <p>25.2.2 reads:</p>
6455 <blockquote>
6456 <p><tt> template&lt;class T&gt; void swap(T&amp; a, T&amp; b);</tt><br>
6457 <br>
6458 Requires: Type T is Assignable (_lib.container.requirements_).<br>
6459 Effects: Exchanges values stored in two locations.</p>
6460 </blockquote>
6461 <p>The only reasonable** generic implementation of swap requires construction of a
6462 new temporary copy of one of its arguments:</p>
6463 <blockquote>
6464 <pre>template&lt;class T&gt; void swap(T&amp; a, T&amp; b);
6466 T tmp(a);
6467 a = b;
6468 b = tmp;
6469 }</pre>
6470 </blockquote>
6471 <p>But a type which is only Assignable cannot be swapped by this implementation.</p>
6472 <p>**Yes, there's also an unreasonable implementation which would require T to be
6473 DefaultConstructible instead of CopyConstructible. I don't think this is worthy
6474 of consideration:</p>
6475 <blockquote>
6476 <pre>template&lt;class T&gt; void swap(T&amp; a, T&amp; b);
6478 T tmp;
6479 tmp = a;
6480 a = b;
6481 b = tmp;
6482 }</pre>
6483 </blockquote>
6484 <p><b>Proposed resolution:</b></p>
6485 <p>Change 25.2.2 paragraph 1 from:</p>
6486 <blockquote>
6487 <p> Requires: Type T is Assignable (23.1).</p>
6488 </blockquote>
6489 <p>to:</p>
6490 <blockquote>
6491 <p> Requires: Type T is CopyConstructible (20.1.3) and Assignable (23.1)</p>
6492 </blockquote>
6493 <hr>
6494 <a name="228"><h3>228.&nbsp;Incorrect specification of "..._byname" facets</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;20 Apr 2000</p>
6495 <p>The sections 22.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname"> [lib.locale.ctype.byname]</a>, 22.2.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname.special"> [lib.locale.ctype.byname.special]</a>,
6496 22.2.1.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.codecvt.byname"> [lib.locale.codecvt.byname]</a>, 22.2.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.numpunct.byname"> [lib.locale.numpunct.byname]</a>, 22.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.collate.byname"> [lib.locale.collate.byname]</a>, 22.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.put.byname"> [lib.locale.time.put.byname]</a>, 22.2.6.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.moneypunct.byname"> [lib.locale.moneypunct.byname]</a>, and 22.2.7.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.messages.byname"> [lib.locale.messages.byname]</a> overspecify the
6497 definitions of the "..._byname" classes by listing a bunch
6498 of virtual functions. At the same time, no semantics of these
6499 functions are defined. Real implementations do not define these
6500 functions because the functional part of the facets is actually
6501 implemented in the corresponding base classes and the constructor of
6502 the "..._byname" version just provides suitable date used by
6503 these implementations. For example, the 'numpunct' methods just return
6504 values from a struct. The base class uses a statically initialized
6505 struct while the derived version reads the contents of this struct
6506 from a table. However, no virtual function is defined in
6507 'numpunct_byname'.</p>
6509 <p>For most classes this does not impose a problem but specifically
6510 for 'ctype' it does: The specialization for 'ctype_byname&lt;char&gt;'
6511 is required because otherwise the semantics would change due to the
6512 virtual functions defined in the general version for 'ctype_byname':
6513 In 'ctype&lt;char&gt;' the method 'do_is()' is not virtual but it is
6514 made virtual in both 'ctype&lt;cT&gt;' and 'ctype_byname&lt;cT&gt;'.
6515 Thus, a class derived from 'ctype_byname&lt;char&gt;' can tell whether
6516 this class is specialized or not under the current specification:
6517 Without the specialization, 'do_is()' is virtual while with
6518 specialization it is not virtual.</p>
6519 <p><b>Proposed resolution:</b></p>
6520 <p>&nbsp; Change section 22.2.1.2 (lib.locale.ctype.byname) to become:</p>
6521 <pre> namespace std {
6522 template &lt;class charT&gt;
6523 class ctype_byname : public ctype&lt;charT&gt; {
6524 public:
6525 typedef ctype&lt;charT&gt;::mask mask;
6526 explicit ctype_byname(const char*, size_t refs = 0);
6527 protected:
6528 ~ctype_byname(); // virtual
6530 }</pre>
6531 <p>&nbsp; Change section 22.2.1.6 (lib.locale.codecvt.byname) to become:</p>
6532 <pre> namespace std {
6533 template &lt;class internT, class externT, class stateT&gt;
6534 class codecvt_byname : public codecvt&lt;internT, externT, stateT&gt; {
6535 public:
6536 explicit codecvt_byname(const char*, size_t refs = 0);
6537 protected:
6538 ~codecvt_byname(); // virtual
6541 </pre>
6542 <p>&nbsp; Change section 22.2.3.2 (lib.locale.numpunct.byname) to become:</p>
6543 <pre> namespace std {
6544 template &lt;class charT&gt;
6545 class numpunct_byname : public numpunct&lt;charT&gt; {
6546 // this class is specialized for char and wchar_t.
6547 public:
6548 typedef charT char_type;
6549 typedef basic_string&lt;charT&gt; string_type;
6550 explicit numpunct_byname(const char*, size_t refs = 0);
6551 protected:
6552 ~numpunct_byname(); // virtual
6554 }</pre>
6555 <p>&nbsp; Change section 22.2.4.2 (lib.locale.collate.byname) to become:</p>
6556 <pre> namespace std {
6557 template &lt;class charT&gt;
6558 class collate_byname : public collate&lt;charT&gt; {
6559 public:
6560 typedef basic_string&lt;charT&gt; string_type;
6561 explicit collate_byname(const char*, size_t refs = 0);
6562 protected:
6563 ~collate_byname(); // virtual
6565 }</pre>
6566 <p>&nbsp; Change section 22.2.5.2 (lib.locale.time.get.byname) to become:</p>
6567 <pre> namespace std {
6568 template &lt;class charT, class InputIterator = istreambuf_iterator&lt;charT&gt; &gt;
6569 class time_get_byname : public time_get&lt;charT, InputIterator&gt; {
6570 public:
6571 typedef time_base::dateorder dateorder;
6572 typedef InputIterator iter_type</pre>
6573 <pre> explicit time_get_byname(const char*, size_t refs = 0);
6574 protected:
6575 ~time_get_byname(); // virtual
6577 }</pre>
6578 <p>&nbsp; Change section 22.2.5.4 (lib.locale.time.put.byname) to become:</p>
6579 <pre> namespace std {
6580 template &lt;class charT, class OutputIterator = ostreambuf_iterator&lt;charT&gt; &gt;
6581 class time_put_byname : public time_put&lt;charT, OutputIterator&gt;
6583 public:
6584 typedef charT char_type;
6585 typedef OutputIterator iter_type;</pre>
6586 <pre> explicit time_put_byname(const char*, size_t refs = 0);
6587 protected:
6588 ~time_put_byname(); // virtual
6590 }"</pre>
6591 <p>&nbsp; Change section 22.2.6.4 (lib.locale.moneypunct.byname) to become:</p>
6592 <pre> namespace std {
6593 template &lt;class charT, bool Intl = false&gt;
6594 class moneypunct_byname : public moneypunct&lt;charT, Intl&gt; {
6595 public:
6596 typedef money_base::pattern pattern;
6597 typedef basic_string&lt;charT&gt; string_type;</pre>
6598 <pre> explicit moneypunct_byname(const char*, size_t refs = 0);
6599 protected:
6600 ~moneypunct_byname(); // virtual
6602 }</pre>
6603 <p>&nbsp; Change section 22.2.7.2 (lib.locale.messages.byname) to become:</p>
6604 <pre> namespace std {
6605 template &lt;class charT&gt;
6606 class messages_byname : public messages&lt;charT&gt; {
6607 public:
6608 typedef messages_base::catalog catalog;
6609 typedef basic_string&lt;charT&gt; string_type;</pre>
6610 <pre> explicit messages_byname(const char*, size_t refs = 0);
6611 protected:
6612 ~messages_byname(); // virtual
6614 }</pre>
6615 <p>Remove section 22.2.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.ctype.byname.special"> [lib.locale.ctype.byname.special]</a> completely (because in
6616 this case only those members are defined to be virtual which are
6617 defined to be virtual in 'ctype&lt;cT&gt;'.)</p>
6619 <p><i>[Post-Tokyo: Dietmar Kühl submitted this issue at the request of
6620 the LWG to solve the underlying problems raised by issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#138">138</a>.]</i></p>
6622 <p><i>[Copenhagen: proposed resolution was revised slightly, to remove
6623 three last virtual functions from <tt>messages_byname</tt>.]</i></p>
6625 <hr>
6626 <a name="229"><h3>229.&nbsp;Unqualified references of other library entities</h3></a><p><b>Section:</b>&nbsp;17.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.contents"> [lib.contents]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;19 Apr 2000</p>
6627 <p>Throughout the library chapters, the descriptions of library entities refer
6628 to other library entities without necessarily qualifying the names.</p>
6630 <p>For example, section 25.2.2 "Swap" describes the effect of
6631 swap_ranges in terms of the unqualified name "swap". This section
6632 could reasonably be interpreted to mean that the library must be implemented so
6633 as to do a lookup of the unqualified name "swap", allowing users to
6634 override any ::std::swap function when Koenig lookup applies.</p>
6636 <p>Although it would have been best to use explicit qualification with
6637 "::std::" throughout, too many lines in the standard would have to be
6638 adjusted to make that change in a Technical Corrigendum.</p>
6640 <p>Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#182">182</a>, which addresses qualification of
6641 <tt>size_t</tt>, is a special case of this.
6642 </p>
6643 <p><b>Proposed resolution:</b></p>
6644 <p>To section 17.4.1.1 "Library contents" Add the following paragraph:</p>
6645 <blockquote>
6646 <p>Whenever a name x defined in the standard library is mentioned, the name x
6647 is assumed to be fully qualified as ::std::x, unless explicitly described
6648 otherwise. For example, if the Effects section for library function F is
6649 described as calling library function G, the function ::std::G is meant.</p>
6650 </blockquote>
6652 <p><i>[Post-Tokyo: Steve Clamage submitted this issue at the request of
6653 the LWG to solve a problem in the standard itself similar to the
6654 problem within implementations of library identified by issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a>. Any resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#225">225</a> should be
6655 coordinated with the resolution of this issue.]</i></p>
6657 <p><i>[post-Toronto: Howard is undecided about whether it is
6658 appropriate for all standard library function names referred to in
6659 other standard library functions to be explicitly qualified by
6660 <tt>std</tt>: it is common advice that users should define global
6661 functions that operate on their class in the same namespace as the
6662 class, and this requires argument-dependent lookup if those functions
6663 are intended to be called by library code. Several LWG members are
6664 concerned that valarray appears to require argument-dependent lookup,
6665 but that the wording may not be clear enough to fall under
6666 "unless explicitly described otherwise".]</i></p>
6668 <p><i>[Curaçao: An LWG-subgroup spent an afternoon working on issues
6669 225, 226, and 229. Their conclusion was that the issues should be
6670 separated into an LWG portion (Howard's paper, N1387=02-0045), and a
6671 EWG portion (Dave will write a proposal). The LWG and EWG had
6672 (separate) discussions of this plan the next day. This paper resolves
6673 issues 225 and 226. In light of that resolution, the proposed
6674 resolution for the current issue makes sense.]</i></p>
6676 <hr>
6677 <a name="230"><h3>230.&nbsp;Assignable specified without also specifying CopyConstructible</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;26 Apr 2000</p>
6678 <p>Issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#227">227</a> identified an instance (std::swap) where
6679 Assignable was specified without also specifying
6680 CopyConstructible. The LWG asked that the standard be searched to
6681 determine if the same defect existed elsewhere.</p>
6683 <p>There are a number of places (see proposed resolution below) where
6684 Assignable is specified without also specifying
6685 CopyConstructible. There are also several cases where both are
6686 specified. For example, 26.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.accumulate"> [lib.accumulate]</a>.</p>
6687 <p><b>Proposed resolution:</b></p>
6688 <p>In 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> table 65 for value_type:
6689 change "T is Assignable" to "T is CopyConstructible and
6690 Assignable"
6691 </p>
6693 <p>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> table 69 X::key_type; change
6694 "Key is Assignable" to "Key is
6695 CopyConstructible and Assignable"<br>
6696 </p>
6698 <p>In 24.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.output.iterators"> [lib.output.iterators]</a> paragraph 1, change:
6699 </p>
6700 <blockquote>
6701 <p> A class or a built-in type X satisfies the requirements of an
6702 output iterator if X is an Assignable type (23.1) and also the
6703 following expressions are valid, as shown in Table 73:
6704 </p>
6705 </blockquote>
6706 <p>to:
6707 </p>
6708 <blockquote>
6709 <p> A class or a built-in type X satisfies the requirements of an
6710 output iterator if X is a CopyConstructible (20.1.3) and Assignable
6711 type (23.1) and also the following expressions are valid, as shown in
6712 Table 73:
6713 </p>
6714 </blockquote>
6716 <p><i>[Post-Tokyo: Beman Dawes submitted this issue at the request of
6717 the LWG. He asks that the 25.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.replace"> [lib.alg.replace]</a> and 25.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.fill"> [lib.alg.fill]</a> changes be studied carefully, as it is not clear that
6718 CopyConstructible is really a requirement and may be
6719 overspecification.]</i></p>
6721 <p><i>[Portions of the resolution for issue 230 have been superceded by
6722 the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#276">276</a>.]</i></p>
6724 <p><b>Rationale:</b></p>
6725 <p>The original proposed resolution also included changes to input
6726 iterator, fill, and replace. The LWG believes that those changes are
6727 not necessary. The LWG considered some blanket statement, where an
6728 Assignable type was also required to be Copy Constructible, but
6729 decided against this because fill and replace really don't require the
6730 Copy Constructible property.</p>
6731 <hr>
6732 <a name="231"><h3>231.&nbsp;Precision in iostream?</h3></a><p><b>Section:</b>&nbsp;22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;James Kanze, Stephen Clamage&nbsp; <b>Date:</b>&nbsp; 25 Apr 2000</p>
6733 <p>What is the following program supposed to output?</p>
6734 <pre>#include &lt;iostream&gt;
6737 main()
6739 std::cout.setf( std::ios::scientific , std::ios::floatfield ) ;
6740 std::cout.precision( 0 ) ;
6741 std::cout &lt;&lt; 1.00 &lt;&lt; '\n' ;
6742 return 0 ;
6743 }</pre>
6744 <p>From my C experience, I would expect "1e+00"; this is what
6745 <tt>printf("%.0e" , 1.00 );</tt> does. G++ outputs
6746 "1.000000e+00".</p>
6748 <p>The only indication I can find in the standard is 22.2.2.2.2/11,
6749 where it says "For conversion from a floating-point type, if
6750 (flags &amp; fixed) != 0 or if str.precision() &gt; 0, then
6751 str.precision() is specified in the conversion specification."
6752 This is an obvious error, however, fixed is not a mask for a field,
6753 but a value that a multi-bit field may take -- the results of and'ing
6754 fmtflags with ios::fixed are not defined, at least not if
6755 ios::scientific has been set. G++'s behavior corresponds to what might
6756 happen if you do use (flags &amp; fixed) != 0 with a typical
6757 implementation (floatfield == 3 &lt;&lt; something, fixed == 1
6758 &lt;&lt; something, and scientific == 2 &lt;&lt; something).</p>
6760 <p>Presumably, the intent is either (flags &amp; floatfield) != 0, or
6761 (flags &amp; floatfield) == fixed; the first gives something more or
6762 less like the effect of precision in a printf floating point
6763 conversion. Only more or less, of course. In order to implement printf
6764 formatting correctly, you must know whether the precision was
6765 explicitly set or not. Say by initializing it to -1, instead of 6, and
6766 stating that for floating point conversions, if precision &lt; -1, 6
6767 will be used, for fixed point, if precision &lt; -1, 1 will be used,
6768 etc. Plus, of course, if precision == 0 and flags &amp; floatfield ==
6769 0, 1 should be = used. But it probably isn't necessary to emulate all
6770 of the anomalies of printf:-).</p>
6771 <p><b>Proposed resolution:</b></p>
6773 Replace 22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>, paragraph 11, with the following
6774 sentence:
6775 </p>
6776 <blockquote>
6777 For conversion from a floating-point type,
6778 <tt><i>str</i>.precision()</tt> is specified in the conversion
6779 specification.
6780 </blockquote>
6781 <p><b>Rationale:</b></p>
6782 <p>The floatfield determines whether numbers are formatted as if
6783 with %f, %e, or %g. If the <tt>fixed</tt> bit is set, it's %f,
6784 if <tt>scientific</tt> it's %e, and if both bits are set, or
6785 neither, it's %g.</p>
6786 <p>Turning to the C standard, a precision of 0 is meaningful
6787 for %f and %e. For %g, precision 0 is taken to be the same as
6788 precision 1.</p>
6789 <p>The proposed resolution has the effect that if neither
6790 <tt>fixed</tt> nor <tt>scientific</tt> is set we'll be
6791 specifying a precision of 0, which will be internally
6792 turned into 1. There's no need to call it out as a special
6793 case.</p>
6794 <p>The output of the above program will be "1e+00".</p>
6796 <p><i>[Post-Curaçao: Howard provided improved wording covering the case
6797 where precision is 0 and mode is %g.]</i></p>
6799 <hr>
6800 <a name="232"><h3>232.&nbsp;"depends" poorly defined in 17.4.3.1</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Peter Dimov&nbsp; <b>Date:</b>&nbsp;18 Apr 2000</p>
6801 <p>17.4.3.1/1 uses the term "depends" to limit the set of allowed
6802 specializations of standard templates to those that "depend on a
6803 user-defined name of external linkage."</p>
6804 <p>This term, however, is not adequately defined, making it possible to
6805 construct a specialization that is, I believe, technically legal according to
6806 17.4.3.1/1, but that specializes a standard template for a built-in type such as
6807 'int'.</p>
6808 <p>The following code demonstrates the problem:</p>
6809 <blockquote>
6810 <pre>#include &lt;algorithm&gt;</pre>
6811 <pre>template&lt;class T&gt; struct X
6813 typedef T type;
6814 };</pre>
6815 <pre>namespace std
6817 template&lt;&gt; void swap(::X&lt;int&gt;::type&amp; i, ::X&lt;int&gt;::type&amp; j);
6818 }</pre>
6819 </blockquote>
6820 <p><b>Proposed resolution:</b></p>
6821 <p>Change "user-defined name" to "user-defined
6822 type".</p>
6823 <p><b>Rationale:</b></p>
6824 <p>This terminology is used in section 2.5.2 and 4.1.1 of <i>The C++
6825 Programming Language</i>. It disallows the example in the issue,
6826 since the underlying type itself is not user-defined. The only
6827 possible problem I can see is for non-type templates, but there's no
6828 possible way for a user to come up with a specialization for bitset,
6829 for example, that might not have already been specialized by the
6830 implementor?</p>
6832 <p><i>[Toronto: this may be related to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#120">120</a>.]</i></p>
6834 <p><i>[post-Toronto: Judy provided the above proposed resolution and
6835 rationale.]</i></p>
6836 <hr>
6837 <a name="234"><h3>234.&nbsp;Typos in allocator definition</h3></a><p><b>Section:</b>&nbsp;20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;24 Apr 2000</p>
6838 <p>In paragraphs 12 and 13 the effects of <tt>construct()</tt> and
6839 <tt>destruct()</tt> are described as returns but the functions actually
6840 return <tt>void</tt>.</p>
6841 <p><b>Proposed resolution:</b></p>
6842 <p>Substitute "Returns" by "Effect".</p>
6843 <hr>
6844 <a name="235"><h3>235.&nbsp;No specification of default ctor for reverse_iterator</h3></a><p><b>Section:</b>&nbsp;24.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iterator"> [lib.reverse.iterator]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;24 Apr 2000</p>
6845 <p>The declaration of <tt>reverse_iterator</tt> lists a default
6846 constructor. However, no specification is given what this constructor
6847 should do.</p>
6848 <p><b>Proposed resolution:</b></p>
6849 <p>In section 24.4.1.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.cons"> [lib.reverse.iter.cons]</a> add the following
6850 paragraph:</p>
6851 <blockquote>
6852 <p><tt>reverse_iterator()</tt></p>
6854 <p>Default initializes <tt>current</tt>. Iterator operations
6855 applied to the resulting iterator have defined behavior if and
6856 only if the corresponding operations are defined on a default
6857 constructed iterator of type <tt>Iterator</tt>.</p>
6858 </blockquote>
6859 <p><i>[pre-Copenhagen: Dietmar provide wording for proposed
6860 resolution.]</i></p>
6861 <hr>
6862 <a name="237"><h3>237.&nbsp;Undefined expression in complexity specification</h3></a><p><b>Section:</b>&nbsp;23.2.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.cons"> [lib.list.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;24 Apr 2000</p>
6863 <p>The complexity specification in paragraph 6 says that the complexity
6864 is linear in <tt>first - last</tt>. Even if <tt>operator-()</tt> is
6865 defined on iterators this term is in general undefined because it
6866 would have to be <tt>last - first</tt>.</p>
6867 <p><b>Proposed resolution:</b></p>
6868 <p>Change paragraph 6 from</p>
6869 <blockquote>Linear in <i>first - last</i>.</blockquote>
6870 <p>to become</p>
6871 <blockquote>Linear in <i>distance(first, last)</i>.</blockquote>
6872 <hr>
6873 <a name="238"><h3>238.&nbsp;Contradictory results of stringbuf initialization.</h3></a><p><b>Section:</b>&nbsp;27.7.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringbuf.cons"> [lib.stringbuf.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dietmar Kühl&nbsp; <b>Date:</b>&nbsp;11 May 2000</p>
6874 <p>In 27.7.1.1 paragraph 4 the results of calling the constructor of
6875 'basic_stringbuf' are said to be <tt>str() == str</tt>. This is fine
6876 that far but consider this code:</p>
6878 <pre> std::basic_stringbuf&lt;char&gt; sbuf("hello, world", std::ios_base::openmode(0));
6879 std::cout &lt;&lt; "'" &lt;&lt; sbuf.str() &lt;&lt; "'\n";
6880 </pre>
6882 <p>Paragraph 3 of 27.7.1.1 basically says that in this case neither
6883 the output sequence nor the input sequence is initialized and
6884 paragraph 2 of 27.7.1.2 basically says that <tt>str()</tt> either
6885 returns the input or the output sequence. None of them is initialized,
6886 ie. both are empty, in which case the return from <tt>str()</tt> is
6887 defined to be <tt>basic_string&lt;cT&gt;()</tt>.</p>
6889 <p>However, probably only test cases in some testsuites will detect this
6890 "problem"...</p>
6891 <p><b>Proposed resolution:</b></p>
6892 <p>Remove 27.7.1.1 paragraph 4.</p>
6893 <p><b>Rationale:</b></p>
6894 <p>We could fix 27.7.1.1 paragraph 4, but there would be no point. If
6895 we fixed it, it would say just the same thing as text that's already
6896 in the standard.</p>
6897 <hr>
6898 <a name="239"><h3>239.&nbsp;Complexity of unique() and/or unique_copy incorrect</h3></a><p><b>Section:</b>&nbsp;25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;May 15 2000</p>
6899 <p>The complexity of unique and unique_copy are inconsistent with each
6900 other and inconsistent with the implementations.&nbsp; The standard
6901 specifies:</p>
6903 <p>for unique():</p>
6905 <blockquote>-3- Complexity: If the range (last - first) is not empty, exactly
6906 (last - first) - 1 applications of the corresponding predicate, otherwise
6907 no applications of the predicate.</blockquote>
6909 <p>for unique_copy():</p>
6911 <blockquote>-7- Complexity: Exactly last - first applications of the corresponding
6912 predicate.</blockquote>
6915 The implementations do it the other way round: unique() applies the
6916 predicate last-first times and unique_copy() applies it last-first-1
6917 times.</p>
6919 <p>As both algorithms use the predicate for pair-wise comparison of
6920 sequence elements I don't see a justification for unique_copy()
6921 applying the predicate last-first times, especially since it is not
6922 specified to which pair in the sequence the predicate is applied
6923 twice.</p>
6924 <p><b>Proposed resolution:</b></p>
6925 <p>Change both complexity sections in 25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a> to:</p>
6927 <blockquote>Complexity: For nonempty ranges, exactly last - first - 1
6928 applications of the corresponding predicate.</blockquote>
6930 <hr>
6931 <a name="240"><h3>240.&nbsp;Complexity of adjacent_find() is meaningless</h3></a><p><b>Section:</b>&nbsp;25.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.adjacent.find"> [lib.alg.adjacent.find]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;May 15 2000</p>
6932 <p>The complexity section of adjacent_find is defective:</p>
6934 <blockquote>
6935 <pre>template &lt;class ForwardIterator&gt;
6936 ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last
6937 BinaryPredicate pred);
6938 </pre>
6940 <p>-1- Returns: The first iterator i such that both i and i + 1 are in
6941 the range [first, last) for which the following corresponding
6942 conditions hold: *i == *(i + 1), pred(*i, *(i + 1)) != false. Returns
6943 last if no such iterator is found.</p>
6945 <p>-2- Complexity: Exactly find(first, last, value) - first applications
6946 of the corresponding predicate.
6947 </p>
6948 </blockquote>
6950 <p>In the Complexity section, it is not defined what "value"
6951 is supposed to mean. My best guess is that "value" means an
6952 object for which one of the conditions pred(*i,value) or
6953 pred(value,*i) is true, where i is the iterator defined in the Returns
6954 section. However, the value type of the input sequence need not be
6955 equality-comparable and for this reason the term find(first, last,
6956 value) - first is meaningless.</p>
6958 <p>A term such as find_if(first, last, bind2nd(pred,*i)) - first or
6959 find_if(first, last, bind1st(pred,*i)) - first might come closer to
6960 the intended specification. Binders can only be applied to function
6961 objects that have the function call operator declared const, which is
6962 not required of predicates because they can have non-const data
6963 members. For this reason, a specification using a binder could only be
6964 an "as-if" specification.</p>
6965 <p><b>Proposed resolution:</b></p>
6966 <p>Change the complexity section in 25.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.adjacent.find"> [lib.alg.adjacent.find]</a> to:</p>
6967 <blockquote>
6968 For a nonempty range, exactly <tt>min((<i>i</i> - <i>first</i>) + 1,
6969 (<i>last</i> - <i>first</i>) - 1)</tt> applications of the
6970 corresponding predicate, where <i>i</i> is <tt>adjacent_find</tt>'s
6971 return value.
6972 </blockquote>
6974 <p><i>[Copenhagen: the original resolution specified an upper
6975 bound. The LWG preferred an exact count.]</i></p>
6977 <hr>
6978 <a name="241"><h3>241.&nbsp;Does unique_copy() require CopyConstructible and Assignable?</h3></a><p><b>Section:</b>&nbsp;25.2.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.unique"> [lib.alg.unique]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;May 15 2000</p>
6980 <p>Some popular implementations of unique_copy() create temporary
6981 copies of values in the input sequence, at least if the input iterator
6982 is a pointer. Such an implementation is built on the assumption that
6983 the value type is CopyConstructible and Assignable.</p>
6985 <p>It is common practice in the standard that algorithms explicitly
6986 specify any additional requirements that they impose on any of the
6987 types used by the algorithm. An example of an algorithm that creates
6988 temporary copies and correctly specifies the additional requirements
6989 is accumulate(), 26.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.accumulate"> [lib.accumulate]</a>.</p>
6991 <p>Since the specifications of unique() and unique_copy() do not
6992 require CopyConstructible and Assignable of the InputIterator's value
6993 type the above mentioned implementations are not standard-compliant. I
6994 cannot judge whether this is a defect in the standard or a defect in
6995 the implementations.</p>
6996 <p><b>Proposed resolution:</b></p>
6997 <p>In 25.2.8 change:</p>
6999 <blockquote>
7000 -4- Requires: The ranges [first, last) and [result, result+(last-first))
7001 shall not overlap.
7002 </blockquote>
7004 <p>to:</p>
7006 <blockquote>
7007 <p>-4- Requires: The ranges [first, last) and [result,
7008 result+(last-first)) shall not overlap. The expression *result =
7009 *first must be valid. If neither InputIterator nor OutputIterator
7010 meets the requirements of forward iterator then the value type of
7011 InputIterator must be copy constructible. Otherwise copy
7012 constructible is not required. </p>
7013 </blockquote>
7015 <p><i>[Redmond: the original proposed resolution didn't impose an
7016 explicit requirement that the iterator's value type must be copy
7017 constructible, on the grounds that an input iterator's value type must
7018 always be copy constructible. Not everyone in the LWG thought that
7019 this requirement was clear from table 72. It has been suggested that
7020 it might be possible to implement <tt>unique_copy</tt> without
7021 requiring assignability, although current implementations do impose
7022 that requirement. Howard provided new wording.]</i></p>
7024 <p><i>[
7025 Curaçao: The LWG changed the PR editorially to specify
7026 "neither...nor...meet..." as clearer than
7027 "both...and...do not meet...". Change believed to be so
7028 minor as not to require re-review.
7029 ]</i></p>
7031 <hr>
7032 <a name="242"><h3>242.&nbsp;Side effects of function objects</h3></a><p><b>Section:</b>&nbsp;25.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.transform"> [lib.alg.transform]</a>, 26.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.numeric.ops"> [lib.numeric.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Angelika Langer&nbsp; <b>Date:</b>&nbsp;May 15 2000</p>
7033 <p>The algorithms transform(), accumulate(), inner_product(),
7034 partial_sum(), and adjacent_difference() require that the function
7035 object supplied to them shall not have any side effects.</p>
7037 <p>The standard defines a side effect in 1.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/intro.html#intro.execution"> [intro.execution]</a> as:</p>
7038 <blockquote>-7- Accessing an object designated by a volatile lvalue (basic.lval),
7039 modifying an object, calling a library I/O function, or calling a function
7040 that does any of those operations are all side effects, which are changes
7041 in the state of the execution environment.</blockquote>
7043 <p>As a consequence, the function call operator of a function object supplied
7044 to any of the algorithms listed above cannot modify data members, cannot
7045 invoke any function that has a side effect, and cannot even create and
7046 modify temporary objects.&nbsp; It is difficult to imagine a function object
7047 that is still useful under these severe limitations. For instance, any
7048 non-trivial transformator supplied to transform() might involve creation
7049 and modification of temporaries, which is prohibited according to the current
7050 wording of the standard.</p>
7052 <p>On the other hand, popular implementations of these algorithms exhibit
7053 uniform and predictable behavior when invoked with a side-effect-producing
7054 function objects. It looks like the strong requirement is not needed for
7055 efficient implementation of these algorithms.</p>
7057 <p>The requirement of&nbsp; side-effect-free function objects could be
7058 replaced by a more relaxed basic requirement (which would hold for all
7059 function objects supplied to any algorithm in the standard library):</p>
7060 <blockquote>A function objects supplied to an algorithm shall not invalidate
7061 any iterator or sequence that is used by the algorithm. Invalidation of
7062 the sequence includes destruction of the sorting order if the algorithm
7063 relies on the sorting order (see section 25.3 - Sorting and related operations
7064 [lib.alg.sorting]).</blockquote>
7066 <p>I can't judge whether it is intended that the function objects supplied
7067 to transform(), accumulate(), inner_product(), partial_sum(), or adjacent_difference()
7068 shall not modify sequence elements through dereferenced iterators.</p>
7070 <p>It is debatable whether this issue is a defect or a change request.
7071 Since the consequences for user-supplied function objects are drastic and
7072 limit the usefulness of the algorithms significantly I would consider it
7073 a defect.</p>
7074 <p><b>Proposed resolution:</b></p>
7076 <p><i>Things to notice about these changes:</i></p>
7078 <ol>
7079 <li> <i>The fully-closed ("[]" as opposed to half-closed "[)" ranges
7080 are intentional. we want to prevent side-effects from
7081 invalidating the end iterators.</i>
7082 </li>
7084 <li> <i>That has the unintentional side-effect of prohibiting
7085 modification of the end element as a side-effect. This could
7086 conceivably be significant in some cases.</i>
7087 </li>
7089 <li> <i>The wording also prevents side-effects from modifying elements
7090 of the output sequence. I can't imagine why anyone would want
7091 to do this, but it is arguably a restriction that implementors
7092 don't need to place on users.</i>
7093 </li>
7095 <li> <i>Lifting the restrictions imposed in #2 and #3 above is possible
7096 and simple, but would require more verbiage.</i>
7097 </li>
7098 </ol>
7100 <p>Change 25.2.3/2 from:</p>
7102 <blockquote>
7103 -2- Requires: op and binary_op shall not have any side effects.
7104 </blockquote>
7106 <p>to:</p>
7108 <blockquote>
7109 -2- Requires: in the ranges [first1, last1], [first2, first2 +
7110 (last1 - first1)] and [result, result + (last1- first1)], op and
7111 binary_op shall neither modify elements nor invalidate iterators or
7112 subranges.
7113 [Footnote: The use of fully closed ranges is intentional --end footnote]
7114 </blockquote>
7117 <p>Change 25.2.3/2 from:</p>
7119 <blockquote>
7120 -2- Requires: op and binary_op shall not have any side effects.
7121 </blockquote>
7123 <p>to:</p>
7125 <blockquote>
7126 -2- Requires: op and binary_op shall not invalidate iterators or
7127 subranges, or modify elements in the ranges [first1, last1],
7128 [first2, first2 + (last1 - first1)], and [result, result + (last1
7129 - first1)].
7130 [Footnote: The use of fully closed ranges is intentional --end footnote]
7131 </blockquote>
7134 <p>Change 26.4.1/2 from:</p>
7136 <blockquote>
7137 -2- Requires: T must meet the requirements of CopyConstructible
7138 (lib.copyconstructible) and Assignable (lib.container.requirements)
7139 types. binary_op shall not cause side effects.
7140 </blockquote>
7142 <p>to:</p>
7144 <blockquote>
7145 -2- Requires: T must meet the requirements of CopyConstructible
7146 (lib.copyconstructible) and Assignable
7147 (lib.container.requirements) types. In the range [first, last],
7148 binary_op shall neither modify elements nor invalidate iterators
7149 or subranges.
7150 [Footnote: The use of a fully closed range is intentional --end footnote]
7151 </blockquote>
7153 <p>Change 26.4.2/2 from:</p>
7155 <blockquote>
7156 -2- Requires: T must meet the requirements of CopyConstructible
7157 (lib.copyconstructible) and Assignable (lib.container.requirements)
7158 types. binary_op1 and binary_op2 shall not cause side effects.
7159 </blockquote>
7161 <p>to:</p>
7163 <blockquote>
7164 -2- Requires: T must meet the requirements of CopyConstructible
7165 (lib.copyconstructible) and Assignable (lib.container.requirements)
7166 types. In the ranges [first, last] and [first2, first2 + (last -
7167 first)], binary_op1 and binary_op2 shall neither modify elements
7168 nor invalidate iterators or subranges.
7169 [Footnote: The use of fully closed ranges is intentional --end footnote]
7170 </blockquote>
7173 <p>Change 26.4.3/4 from:</p>
7175 <blockquote>
7176 -4- Requires: binary_op is expected not to have any side effects.
7177 </blockquote>
7179 <p>to:</p>
7181 <blockquote>
7182 -4- Requires: In the ranges [first, last] and [result, result +
7183 (last - first)], binary_op shall neither modify elements nor
7184 invalidate iterators or subranges.
7185 [Footnote: The use of fully closed ranges is intentional --end footnote]
7186 </blockquote>
7188 <p>Change 26.4.4/2 from:</p>
7190 <blockquote>
7191 -2- Requires: binary_op shall not have any side effects.
7192 </blockquote>
7194 <p>to:</p>
7196 <blockquote>
7197 -2- Requires: In the ranges [first, last] and [result, result +
7198 (last - first)], binary_op shall neither modify elements nor
7199 invalidate iterators or subranges.
7200 [Footnote: The use of fully closed ranges is intentional --end footnote]
7201 </blockquote>
7203 <p><i>[Toronto: Dave Abrahams supplied wording.]</i></p>
7205 <p><i>[Copenhagen: Proposed resolution was modified slightly. Matt
7206 added footnotes pointing out that the use of closed ranges was
7207 intentional.]</i></p>
7209 <hr>
7210 <a name="243"><h3>243.&nbsp;<tt>get</tt> and <tt>getline</tt> when sentry reports failure</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;May 15 2000</p>
7211 <p>basic_istream&lt;&gt;::get(), and basic_istream&lt;&gt;::getline(),
7212 are unclear with respect to the behavior and side-effects of the named
7213 functions in case of an error.</p>
7215 <p>27.6.1.3, p1 states that "... If the sentry object returns
7216 true, when converted to a value of type bool, the function endeavors
7217 to obtain the requested input..." It is not clear from this (or
7218 the rest of the paragraph) what precisely the behavior should be when
7219 the sentry ctor exits by throwing an exception or when the sentry
7220 object returns false. In particular, what is the number of characters
7221 extracted that gcount() returns supposed to be?</p>
7223 <p>27.6.1.3 p8 and p19 say about the effects of get() and getline():
7224 "... In any case, it then stores a null character (using
7225 charT()) into the next successive location of the array." Is not
7226 clear whether this sentence applies if either of the conditions above
7227 holds (i.e., when sentry fails).</p>
7228 <p><b>Proposed resolution:</b></p>
7229 <p>Add to 27.6.1.3, p1 after the sentence</p>
7231 <blockquote>
7232 "... If the sentry object returns true, when converted to a value of
7233 type bool, the function endeavors to obtain the requested input."
7234 </blockquote>
7236 <p>the following</p>
7239 <blockquote>
7240 "Otherwise, if the sentry constructor exits by throwing an exception or
7241 if the sentry object returns false, when converted to a value of type
7242 bool, the function returns without attempting to obtain any input. In
7243 either case the number of extracted characters is set to 0; unformatted
7244 input functions taking a character array of non-zero size as an argument
7245 shall also store a null character (using charT()) in the first location
7246 of the array."
7247 </blockquote>
7248 <p><b>Rationale:</b></p>
7249 <p>Although the general philosophy of the input functions is that the
7250 argument should not be modified upon failure, <tt>getline</tt>
7251 historically added a terminating null unconditionally. Most
7252 implementations still do that. Earlier versions of the draft standard
7253 had language that made this an unambiguous requirement; those words
7254 were moved to a place where their context made them less clear. See
7255 Jerry Schwarz's message c++std-lib-7618.</p>
7256 <hr>
7257 <a name="248"><h3>248.&nbsp;time_get fails to set eofbit</h3></a><p><b>Section:</b>&nbsp;22.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.category.time"> [lib.category.time]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;22 June 2000</p>
7258 <p>There is no requirement that any of time_get member functions set
7259 ios::eofbit when they reach the end iterator while parsing their input.
7260 Since members of both the num_get and money_get facets are required to
7261 do so (22.2.2.1.2, and 22.2.6.1.2, respectively), time_get members
7262 should follow the same requirement for consistency.</p>
7263 <p><b>Proposed resolution:</b></p>
7264 <p>Add paragraph 2 to section 22.2.5.1 with the following text:</p>
7266 <blockquote>
7267 If the end iterator is reached during parsing by any of the get()
7268 member functions, the member sets ios_base::eofbit in err.
7269 </blockquote>
7270 <p><b>Rationale:</b></p>
7271 <p>Two alternative resolutions were proposed. The LWG chose this one
7272 because it was more consistent with the way eof is described for other
7273 input facets.</p>
7274 <hr>
7275 <a name="250"><h3>250.&nbsp;splicing invalidates iterators</h3></a><p><b>Section:</b>&nbsp;23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Brian Parker &nbsp; <b>Date:</b>&nbsp;14 Jul 2000</p>
7277 Section 23.2.2.4 [lib.list.ops] states that
7278 </p>
7279 <pre> void splice(iterator position, list&lt;T, Allocator&gt;&amp; x);
7280 </pre>
7282 <i>invalidates</i> all iterators and references to list <tt>x</tt>.
7283 </p>
7286 This is unnecessary and defeats an important feature of splice. In
7287 fact, the SGI STL guarantees that iterators to <tt>x</tt> remain valid
7288 after <tt>splice</tt>.
7289 </p>
7290 <p><b>Proposed resolution:</b></p>
7292 <p>Add a footnote to 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, paragraph 1:</p>
7293 <blockquote>
7294 [<i>Footnote:</i> As specified in 20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a>, paragraphs
7295 4-5, the semantics described in this clause applies only to the case
7296 where allocators compare equal. --end footnote]
7297 </blockquote>
7299 <p>In 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, replace paragraph 4 with:</p>
7300 <blockquote>
7301 Effects: Inserts the contents of x before position and x becomes
7302 empty. Pointers and references to the moved elements of x now refer to
7303 those same elements but as members of *this. Iterators referring to the
7304 moved elements will continue to refer to their elements, but they now
7305 behave as iterators into *this, not into x.
7306 </blockquote>
7308 <p>In 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, replace paragraph 7 with:</p>
7309 <blockquote>
7310 Effects: Inserts an element pointed to by i from list x before
7311 position and removes the element from x. The result is unchanged if
7312 position == i or position == ++i. Pointers and references to *i continue
7313 to refer to this same element but as a member of *this. Iterators to *i
7314 (including i itself) continue to refer to the same element, but now
7315 behave as iterators into *this, not into x.
7316 </blockquote>
7318 <p>In 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, replace paragraph 12 with:</p>
7319 <blockquote>
7320 Requires: [first, last) is a valid range in x. The result is
7321 undefined if position is an iterator in the range [first, last).
7322 Pointers and references to the moved elements of x now refer to those
7323 same elements but as members of *this. Iterators referring to the moved
7324 elements will continue to refer to their elements, but they now behave as
7325 iterators into *this, not into x.
7326 </blockquote>
7328 <p><i>[pre-Copenhagen: Howard provided wording.]</i></p>
7329 <p><b>Rationale:</b></p>
7330 <p>The original proposed resolution said that iterators and references
7331 would remain "valid". The new proposed resolution clarifies what that
7332 means. Note that this only applies to the case of equal allocators.
7333 &gt;From 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, the behavior of list when
7334 allocators compare nonequal is outside the scope of the standard.</p>
7335 <hr>
7336 <a name="251"><h3>251.&nbsp;basic_stringbuf missing allocator_type</h3></a><p><b>Section:</b>&nbsp;27.7.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringbuf"> [lib.stringbuf]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jul 2000</p>
7337 <p>The synopsis for the template class <tt>basic_stringbuf</tt>
7338 doesn't list a typedef for the template parameter
7339 <tt>Allocator</tt>. This makes it impossible to determine the type of
7340 the allocator at compile time. It's also inconsistent with all other
7341 template classes in the library that do provide a typedef for the
7342 <tt>Allocator</tt> parameter.</p>
7343 <p><b>Proposed resolution:</b></p>
7344 <p>Add to the synopses of the class templates basic_stringbuf (27.7.1),
7345 basic_istringstream (27.7.2), basic_ostringstream (27.7.3), and
7346 basic_stringstream (27.7.4) the typedef:</p>
7347 <pre> typedef Allocator allocator_type;
7348 </pre>
7349 <hr>
7350 <a name="252"><h3>252.&nbsp;missing casts/C-style casts used in iostreams</h3></a><p><b>Section:</b>&nbsp;27.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.string.streams"> [lib.string.streams]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jul 2000</p>
7351 <p>27.7.2.2, p1 uses a C-style cast rather than the more appropriate
7352 const_cast&lt;&gt; in the Returns clause for basic_istringstream&lt;&gt;::rdbuf().
7353 The same C-style cast is being used in 27.7.3.2, p1, D.7.2.2, p1, and
7354 D.7.3.2, p1, and perhaps elsewhere. 27.7.6, p1 and D.7.2.2, p1 are missing
7355 the cast altogether.</p>
7357 <p>C-style casts have not been deprecated, so the first part of this
7358 issue is stylistic rather than a matter of correctness.</p>
7359 <p><b>Proposed resolution:</b></p>
7360 <p>In 27.7.2.2, p1 replace </p>
7361 <pre> -1- Returns: (basic_stringbuf&lt;charT,traits,Allocator&gt;*)&amp;sb.</pre>
7363 <p>with</p>
7364 <pre> -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>
7367 <p>In 27.7.3.2, p1 replace</p>
7368 <pre> -1- Returns: (basic_stringbuf&lt;charT,traits,Allocator&gt;*)&amp;sb.</pre>
7370 <p>with</p>
7371 <pre> -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>
7373 <p>In 27.7.6, p1, replace</p>
7374 <pre> -1- Returns: &amp;sb</pre>
7376 <p>with</p>
7377 <pre> -1- Returns: const_cast&lt;basic_stringbuf&lt;charT,traits,Allocator&gt;*&gt;(&amp;sb).</pre>
7379 <p>In D.7.2.2, p1 replace</p>
7380 <pre> -2- Returns: &amp;sb. </pre>
7382 <p>with</p>
7383 <pre> -2- Returns: const_cast&lt;strstreambuf*&gt;(&amp;sb).</pre>
7384 <hr>
7385 <a name="253"><h3>253.&nbsp;valarray helper functions are almost entirely useless</h3></a><p><b>Section:</b>&nbsp;26.3.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.cons"> [lib.valarray.cons]</a>, 26.3.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.assign"> [lib.valarray.assign]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Robert Klarer&nbsp; <b>Date:</b>&nbsp;31 Jul 2000</p>
7386 <p>This discussion is adapted from message c++std-lib-7056 posted
7387 November 11, 1999. I don't think that anyone can reasonably claim
7388 that the problem described below is NAD.</p>
7390 <p>These valarray constructors can never be called:</p>
7392 <pre> template &lt;class T&gt;
7393 valarray&lt;T&gt;::valarray(const slice_array&lt;T&gt; &amp;);
7394 template &lt;class T&gt;
7395 valarray&lt;T&gt;::valarray(const gslice_array&lt;T&gt; &amp;);
7396 template &lt;class T&gt;
7397 valarray&lt;T&gt;::valarray(const mask_array&lt;T&gt; &amp;);
7398 template &lt;class T&gt;
7399 valarray&lt;T&gt;::valarray(const indirect_array&lt;T&gt; &amp;);
7400 </pre>
7402 <p>Similarly, these valarray assignment operators cannot be
7403 called:</p>
7405 <pre> template &lt;class T&gt;
7406 valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const slice_array&lt;T&gt; &amp;);
7407 template &lt;class T&gt;
7408 valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const gslice_array&lt;T&gt; &amp;);
7409 template &lt;class T&gt;
7410 valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const mask_array&lt;T&gt; &amp;);
7411 template &lt;class T&gt;
7412 valarray&lt;T&gt; valarray&lt;T&gt;::operator=(const indirect_array&lt;T&gt; &amp;);
7413 </pre>
7415 <p>Please consider the following example:</p>
7417 <pre> #include &lt;valarray&gt;
7418 using namespace std;
7420 int main()
7422 valarray&lt;double&gt; va1(12);
7423 valarray&lt;double&gt; va2(va1[slice(1,4,3)]); // line 1
7425 </pre>
7428 <p>Since the valarray va1 is non-const, the result of the sub-expression
7429 va1[slice(1,4,3)] at line 1 is an rvalue of type const
7430 std::slice_array&lt;double&gt;. This slice_array rvalue is then used to
7431 construct va2. The constructor that is used to construct va2 is
7432 declared like this:</p>
7434 <pre> template &lt;class T&gt;
7435 valarray&lt;T&gt;::valarray(const slice_array&lt;T&gt; &amp;);
7436 </pre>
7438 <p>Notice the constructor's const reference parameter. When the
7439 constructor is called, a slice_array must be bound to this reference.
7440 The rules for binding an rvalue to a const reference are in 8.5.3,
7441 paragraph 5 (see also 13.3.3.1.4). Specifically, paragraph 5
7442 indicates that a second slice_array rvalue is constructed (in this
7443 case copy-constructed) from the first one; it is this second rvalue
7444 that is bound to the reference parameter. Paragraph 5 also requires
7445 that the constructor that is used for this purpose be callable,
7446 regardless of whether the second rvalue is elided. The
7447 copy-constructor in this case is not callable, however, because it is
7448 private. Therefore, the compiler should report an error.</p>
7450 <p>Since slice_arrays are always rvalues, the valarray constructor that has a
7451 parameter of type const slice_array&lt;T&gt; &amp; can never be called. The
7452 same reasoning applies to the three other constructors and the four
7453 assignment operators that are listed at the beginning of this post.
7454 Furthermore, since these functions cannot be called, the valarray helper
7455 classes are almost entirely useless.</p>
7456 <p><b>Proposed resolution:</b></p>
7457 <p>slice_array:</p>
7458 <ul>
7459 <li> Make the copy constructor and copy-assignment operator declarations
7460 public in the slice_array class template definition in 26.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.slice.array"> [lib.template.slice.array]</a> </li>
7461 <li> remove paragraph 3 of 26.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.slice.array"> [lib.template.slice.array]</a>
7462 </li>
7463 <li> remove the copy constructor declaration from 26.3.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.cons.slice.arr"> [lib.cons.slice.arr]</a>
7464 </li>
7465 <li> change paragraph 1 of 26.3.5.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.cons.slice.arr"> [lib.cons.slice.arr]</a> to read "This constructor is declared
7466 to be private. This constructor need not be defined."</li>
7467 <li> remove the first sentence of paragraph 1 of 26.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.assign"> [lib.slice.arr.assign]</a>
7468 </li>
7469 <li> Change the first three words of the second sentence of paragraph 1 of
7470 26.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.slice.arr.assign"> [lib.slice.arr.assign]</a> to "These assignment operators have"</li>
7471 </ul>
7473 <p>gslice_array:</p>
7474 <ul>
7475 <li> Make the copy constructor and copy-assignment operator declarations
7476 public in the gslice_array class template definition in 26.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.gslice.array"> [lib.template.gslice.array]</a> </li>
7477 <li> remove the note in paragraph 3 of 26.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.gslice.array"> [lib.template.gslice.array]</a>
7478 </li>
7479 <li> remove the copy constructor declaration from 26.3.7.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.cons"> [lib.gslice.array.cons]</a>
7480 </li>
7481 <li> change paragraph 1 of 26.3.7.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.cons"> [lib.gslice.array.cons]</a> to read "This constructor is declared
7482 to be private. This constructor need not be defined."</li>
7483 <li> remove the first sentence of paragraph 1 of 26.3.7.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.assign"> [lib.gslice.array.assign]</a>
7484 </li>
7485 <li> Change the first three words of the second sentence of paragraph 1 of
7486 26.3.7.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.gslice.array.assign"> [lib.gslice.array.assign]</a> to "These assignment operators have"</li>
7487 </ul>
7489 <p>mask_array:</p>
7490 <ul>
7491 <li> Make the copy constructor and copy-assignment operator declarations
7492 public in the mask_array class template definition in 26.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.mask.array"> [lib.template.mask.array]</a> </li>
7493 <li> remove the note in paragraph 2 of 26.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.mask.array"> [lib.template.mask.array]</a>
7494 </li>
7495 <li> remove the copy constructor declaration from 26.3.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.cons"> [lib.mask.array.cons]</a>
7496 </li>
7497 <li> change paragraph 1 of 26.3.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.cons"> [lib.mask.array.cons]</a> to read "This constructor is declared
7498 to be private. This constructor need not be defined."</li>
7499 <li> remove the first sentence of paragraph 1 of 26.3.8.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.assign"> [lib.mask.array.assign]</a>
7500 </li>
7501 <li> Change the first three words of the second sentence of paragraph 1 of
7502 26.3.8.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.mask.array.assign"> [lib.mask.array.assign]</a> to "These assignment operators have"</li>
7503 </ul>
7505 <p>indirect_array:</p>
7506 <ul>
7507 <li>Make the copy constructor and copy-assignment operator declarations
7508 public in the indirect_array class definition in 26.3.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.indirect.array"> [lib.template.indirect.array]</a>
7509 </li>
7510 <li> remove the note in paragraph 2 of 26.3.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.indirect.array"> [lib.template.indirect.array]</a>
7511 </li>
7512 <li> remove the copy constructor declaration from 26.3.9.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.cons"> [lib.indirect.array.cons]</a>
7513 </li>
7514 <li> change the descriptive text in 26.3.9.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.cons"> [lib.indirect.array.cons]</a> to read "This constructor is
7515 declared to be private. This constructor need not be defined."</li>
7516 <li> remove the first sentence of paragraph 1 of 26.3.9.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.assign"> [lib.indirect.array.assign]</a>
7517 </li>
7518 <li> Change the first three words of the second sentence of paragraph 1 of
7519 26.3.9.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.indirect.array.assign"> [lib.indirect.array.assign]</a> to "These assignment operators have"</li>
7520 </ul>
7521 <p><i>[Proposed resolution was modified in Santa Cruz: explicitly make
7522 copy constructor and copy assignment operators public, instead of
7523 removing them.]</i></p>
7524 <p><b>Rationale:</b></p>
7525 <p>Keeping the valarray constructors private is untenable. Merely
7526 making valarray a friend of the helper classes isn't good enough,
7527 because access to the copy constructor is checked in the user's
7528 environment.</p>
7530 <p>Making the assignment operator public is not strictly necessary to
7531 solve this problem. A majority of the LWG <i>(straw poll: 13-4)</i>
7532 believed we should make the assignment operators public, in addition
7533 to the copy constructors, for reasons of symmetry and user
7534 expectation.</p>
7535 <hr>
7536 <a name="256"><h3>256.&nbsp;typo in 27.4.4.2, p17: copy_event does not exist</h3></a><p><b>Section:</b>&nbsp;27.4.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.members"> [lib.basic.ios.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;21 Aug 2000</p>
7538 27.4.4.2, p17 says
7539 </p>
7541 <blockquote>
7542 -17- Before copying any parts of rhs, calls each registered callback
7543 pair (fn,index) as (*fn)(erase_event,*this,index). After all parts but
7544 exceptions() have been replaced, calls each callback pair that was
7545 copied from rhs as (*fn)(copy_event,*this,index).
7546 </blockquote>
7549 The name copy_event isn't defined anywhere. The intended name was
7550 copyfmt_event.
7551 </p>
7552 <p><b>Proposed resolution:</b></p>
7553 <p>Replace copy_event with copyfmt_event in the named paragraph.</p>
7554 <hr>
7555 <a name="259"><h3>259.&nbsp;<tt>basic_string::operator[]</tt> and const correctness</h3></a><p><b>Section:</b>&nbsp;21.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.access"> [lib.string.access]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Chris Newton &nbsp; <b>Date:</b>&nbsp;27 Aug 2000</p>
7557 <i>Paraphrased from a message that Chris Newton posted to comp.std.c++:</i>
7558 </p>
7561 The standard's description of <tt>basic_string&lt;&gt;::operator[]</tt>
7562 seems to violate const correctness.
7563 </p>
7566 The standard (21.3.4/1) says that "If <tt>pos &lt; size()</tt>,
7567 returns <tt>data()[pos]</tt>." The types don't work. The
7568 return value of <tt>data()</tt> is <tt>const charT*</tt>, but
7569 <tt>operator[]</tt> has a non-const version whose return type is <tt>reference</tt>.
7570 </p>
7571 <p><b>Proposed resolution:</b></p>
7573 In section 21.3.4, paragraph 1, change
7574 "<tt>data()[<i>pos</i>]</tt>" to "<tt>*(begin() +
7575 <i>pos</i>)</tt>".
7576 </p>
7577 <hr>
7578 <a name="260"><h3>260.&nbsp;Inconsistent return type of <tt>istream_iterator::operator++(int)</tt>
7579 </h3></a><p><b>Section:</b>&nbsp;24.5.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istream.iterator.ops"> [lib.istream.iterator.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;27 Aug 2000</p>
7580 <p>The synopsis of istream_iterator::operator++(int) in 24.5.1 shows
7581 it as returning the iterator by value. 24.5.1.2, p5 shows the same
7582 operator as returning the iterator by reference. That's incorrect
7583 given the Effects clause below (since a temporary is returned). The
7584 `&amp;' is probably just a typo.</p>
7585 <p><b>Proposed resolution:</b></p>
7586 <p>Change the declaration in 24.5.1.2, p5 from</p>
7587 <pre> istream_iterator&lt;T,charT,traits,Distance&gt;&amp; operator++(int);
7588 </pre>
7589 <p>to</p>
7590 <pre> istream_iterator&lt;T,charT,traits,Distance&gt; operator++(int);
7591 </pre>
7592 <p>(that is, remove the `&amp;').</p>
7593 <hr>
7594 <a name="261"><h3>261.&nbsp;Missing description of <tt>istream_iterator::operator!=</tt>
7595 </h3></a><p><b>Section:</b>&nbsp;24.5.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istream.iterator.ops"> [lib.istream.iterator.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;27 Aug 2000</p>
7597 24.5.1, p3 lists the synopsis for
7598 </p>
7600 <pre> template &lt;class T, class charT, class traits, class Distance&gt;
7601 bool operator!=(const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; x,
7602 const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; y);
7603 </pre>
7606 but there is no description of what the operator does (i.e., no Effects
7607 or Returns clause) in 24.5.1.2.
7608 </p>
7609 <p><b>Proposed resolution:</b></p>
7611 Add paragraph 7 to the end of section 24.5.1.2 with the following text:
7612 </p>
7614 <pre> template &lt;class T, class charT, class traits, class Distance&gt;
7615 bool operator!=(const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; x,
7616 const istream_iterator&lt;T,charT,traits,Distance&gt;&amp; y);
7617 </pre>
7619 <p>-7- Returns: !(x == y).</p>
7620 <hr>
7621 <a name="262"><h3>262.&nbsp;Bitmask operator ~ specified incorrectly</h3></a><p><b>Section:</b>&nbsp;17.3.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.bitmask.types"> [lib.bitmask.types]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;03 Sep 2000</p>
7623 The ~ operation should be applied after the cast to int_type.
7624 </p>
7625 <p><b>Proposed resolution:</b></p>
7627 Change 17.3.2.1.2 [lib.bitmask.types] operator~ from:
7628 </p>
7630 <pre> bitmask operator~ ( bitmask X )
7631 { return static_cast&lt; bitmask&gt;(static_cast&lt;int_type&gt;(~ X)); }
7632 </pre>
7636 </p>
7638 <pre> bitmask operator~ ( bitmask X )
7639 { return static_cast&lt; bitmask&gt;(~static_cast&lt;int_type&gt;(X)); }
7640 </pre>
7641 <hr>
7642 <a name="263"><h3>263.&nbsp;Severe restriction on <tt>basic_string</tt> reference counting</h3></a><p><b>Section:</b>&nbsp;21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Kevlin Henney&nbsp; <b>Date:</b>&nbsp;04 Sep 2000</p>
7644 The note in paragraph 6 suggests that the invalidation rules for
7645 references, pointers, and iterators in paragraph 5 permit a reference-
7646 counted implementation (actually, according to paragraph 6, they permit
7647 a "reference counted implementation", but this is a minor editorial fix).
7648 </p>
7651 However, the last sub-bullet is so worded as to make a reference-counted
7652 implementation unviable. In the following example none of the
7653 conditions for iterator invalidation are satisfied:
7654 </p>
7656 <pre> // first example: "*******************" should be printed twice
7657 string original = "some arbitrary text", copy = original;
7658 const string &amp; alias = original;
7660 string::const_iterator i = alias.begin(), e = alias.end();
7661 for(string::iterator j = original.begin(); j != original.end(); ++j)
7662 *j = '*';
7663 while(i != e)
7664 cout &lt;&lt; *i++;
7665 cout &lt;&lt; endl;
7666 cout &lt;&lt; original &lt;&lt; endl;
7667 </pre>
7670 Similarly, in the following example:
7671 </p>
7673 <pre> // second example: "some arbitrary text" should be printed out
7674 string original = "some arbitrary text", copy = original;
7675 const string &amp; alias = original;
7677 string::const_iterator i = alias.begin();
7678 original.begin();
7679 while(i != alias.end())
7680 cout &lt;&lt; *i++;
7681 </pre>
7684 I have tested this on three string implementations, two of which were
7685 reference counted. The reference-counted implementations gave
7686 "surprising behavior" because they invalidated iterators on
7687 the first call to non-const begin since construction. The current
7688 wording does not permit such invalidation because it does not take
7689 into account the first call since construction, only the first call
7690 since various member and non-member function calls.
7691 </p>
7692 <p><b>Proposed resolution:</b></p>
7694 Change the following sentence in 21.3 paragraph 5 from
7695 </p>
7697 <blockquote>
7698 Subsequent to any of the above uses except the forms of insert() and
7699 erase() which return iterators, the first call to non-const member
7700 functions operator[](), at(), begin(), rbegin(), end(), or rend().
7701 </blockquote>
7703 <p>to</p>
7705 <blockquote>
7706 Following construction or any of the above uses, except the forms of
7707 insert() and erase() that return iterators, the first call to non-
7708 const member functions operator[](), at(), begin(), rbegin(), end(),
7709 or rend().
7710 </blockquote>
7711 <hr>
7712 <a name="264"><h3>264.&nbsp;Associative container <tt>insert(i, j)</tt> complexity requirements are not feasible.</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;John Potter&nbsp; <b>Date:</b>&nbsp;07 Sep 2000</p>
7714 Table 69 requires linear time if [i, j) is sorted. Sorted is necessary but not sufficient.
7715 Consider inserting a sorted range of even integers into a set&lt;int&gt; containing the odd
7716 integers in the same range.
7717 </p>
7719 <p><i>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#102">102</a></i></p>
7720 <p><b>Proposed resolution:</b></p>
7722 In Table 69, in section 23.1.2, change the complexity clause for
7723 insertion of a range from "N log(size() + N) (N is the distance
7724 from i to j) in general; linear if [i, j) is sorted according to
7725 value_comp()" to "N log(size() + N), where N is the distance
7726 from i to j".
7727 </p>
7729 <p><i>[Copenhagen: Minor fix in proposed resolution: fixed unbalanced
7730 parens in the revised wording.]</i></p>
7732 <p><b>Rationale:</b></p>
7734 Testing for valid insertions could be less efficient than simply
7735 inserting the elements when the range is not both sorted and between
7736 two adjacent existing elements; this could be a QOI issue.
7737 </p>
7739 <p>
7740 The LWG considered two other options: (a) specifying that the
7741 complexity was linear if [i, j) is sorted according to value_comp()
7742 and between two adjacent existing elements; or (b) changing to
7743 Klog(size() + N) + (N - K) (N is the distance from i to j and K is the
7744 number of elements which do not insert immediately after the previous
7745 element from [i, j) including the first). The LWG felt that, since
7746 we can't guarantee linear time complexity whenever the range to be
7747 inserted is sorted, it's more trouble than it's worth to say that it's
7748 linear in some special cases.
7749 </p>
7750 <hr>
7751 <a name="265"><h3>265.&nbsp;std::pair::pair() effects overly restrictive</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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;11 Sep 2000</p>
7753 I don't see any requirements on the types of the elements of the
7754 std::pair container in 20.2.2. From the descriptions of the member
7755 functions it appears that they must at least satisfy the requirements of
7756 20.1.3 [lib.copyconstructible] and 20.1.4 [lib.default.con.req], and in
7757 the case of the [in]equality operators also the requirements of 20.1.1
7758 [lib.equalitycomparable] and 20.1.2 [lib.lessthancomparable].
7759 </p>
7762 I believe that the the CopyConstructible requirement is unnecessary in
7763 the case of 20.2.2, p2.
7764 </p>
7765 <p><b>Proposed resolution:</b></p>
7766 <p>Change the Effects clause in 20.2.2, p2 from</p>
7768 <blockquote>
7769 -2- <b>Effects</b>: Initializes its members as if implemented: <tt> pair() :
7770 first(T1()), second(T2()) {} </tt>
7771 </blockquote>
7773 <p>to</p>
7775 <blockquote>
7776 -2- <b>Effects</b>: Initializes its members as if implemented: <tt> pair() :
7777 first(), second() {} </tt>
7778 </blockquote>
7779 <p><b>Rationale:</b></p>
7780 <p>The existing specification of pair's constructor appears to be a
7781 historical artifact: there was concern that pair's members be properly
7782 zero-initialized when they are built-in types. At one time there was
7783 uncertainty about whether they would be zero-initialized if the
7784 default constructor was written the obvious way. This has been
7785 clarified by core issue 178, and there is no longer any doubt that
7786 the straightforward implementation is correct.</p>
7787 <hr>
7788 <a name="266"><h3>266.&nbsp;bad_exception::~bad_exception() missing Effects clause</h3></a><p><b>Section:</b>&nbsp;18.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.bad.exception"> [lib.bad.exception]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;24 Sep 2000</p>
7790 The synopsis for std::bad_exception lists the function ~bad_exception()
7791 but there is no description of what the function does (the Effects
7792 clause is missing).
7793 </p>
7794 <p><b>Proposed resolution:</b></p>
7796 Remove the destructor from the class synopses of
7797 <tt>bad_alloc</tt> (18.4.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.bad.alloc"> [lib.bad.alloc]</a>),
7798 <tt>bad_cast</tt> (18.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.bad.cast"> [lib.bad.cast]</a>),
7799 <tt>bad_typeid</tt> (18.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.bad.typeid"> [lib.bad.typeid]</a>),
7800 and <tt>bad_exception</tt> (18.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.bad.exception"> [lib.bad.exception]</a>).
7801 </p>
7802 <p><b>Rationale:</b></p>
7804 This is a general problem with the exception classes in clause 18.
7805 The proposed resolution is to remove the destructors from the class
7806 synopses, rather than to document the destructors' behavior, because
7807 removing them is more consistent with how exception classes are
7808 described in clause 19.
7809 </p>
7810 <hr>
7811 <a name="268"><h3>268.&nbsp;Typo in locale synopsis</h3></a><p><b>Section:</b>&nbsp;22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;5 Oct 2000</p>
7812 <p>The synopsis of the class std::locale in 22.1.1 contains two typos:
7813 the semicolons after the declarations of the default ctor
7814 locale::locale() and the copy ctor locale::locale(const locale&amp;)
7815 are missing.</p>
7816 <p><b>Proposed resolution:</b></p>
7817 <p>Add the missing semicolons, i.e., change</p>
7819 <pre> // construct/copy/destroy:
7820 locale() throw()
7821 locale(const locale&amp; other) throw()
7822 </pre>
7824 <p>in the synopsis in 22.1.1 to</p>
7826 <pre> // construct/copy/destroy:
7827 locale() throw();
7828 locale(const locale&amp; other) throw();
7829 </pre>
7830 <hr>
7831 <a name="270"><h3>270.&nbsp;Binary search requirements overly strict</h3></a><p><b>Section:</b>&nbsp;25.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.binary.search"> [lib.alg.binary.search]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;18 Oct 2000</p>
7833 Each of the four binary search algorithms (lower_bound, upper_bound,
7834 equal_range, binary_search) has a form that allows the user to pass a
7835 comparison function object. According to 25.3, paragraph 2, that
7836 comparison function object has to be a strict weak ordering.
7837 </p>
7840 This requirement is slightly too strict. Suppose we are searching
7841 through a sequence containing objects of type X, where X is some
7842 large record with an integer key. We might reasonably want to look
7843 up a record by key, in which case we would want to write something
7844 like this:
7845 </p>
7846 <pre> struct key_comp {
7847 bool operator()(const X&amp; x, int n) const {
7848 return x.key() &lt; n;
7852 std::lower_bound(first, last, 47, key_comp());
7853 </pre>
7856 key_comp is not a strict weak ordering, but there is no reason to
7857 prohibit its use in lower_bound.
7858 </p>
7861 There's no difficulty in implementing lower_bound so that it allows
7862 the use of something like key_comp. (It will probably work unless an
7863 implementor takes special pains to forbid it.) What's difficult is
7864 formulating language in the standard to specify what kind of
7865 comparison function is acceptable. We need a notion that's slightly
7866 more general than that of a strict weak ordering, one that can encompass
7867 a comparison function that involves different types. Expressing that
7868 notion may be complicated.
7869 </p>
7871 <p><i>Additional questions raised at the Toronto meeting:</i></p>
7872 <ul>
7873 <li> Do we really want to specify what ordering the implementor must
7874 use when calling the function object? The standard gives
7875 specific expressions when describing these algorithms, but it also
7876 says that other expressions (with different argument order) are
7877 equivalent.</li>
7878 <li> If we are specifying ordering, note that the standard uses both
7879 orderings when describing <tt>equal_range</tt>.</li>
7880 <li> Are we talking about requiring these algorithms to work properly
7881 when passed a binary function object whose two argument types
7882 are not the same, or are we talking about requirements when
7883 they are passed a binary function object with several overloaded
7884 versions of <tt>operator()</tt>?</li>
7885 <li> The definition of a strict weak ordering does not appear to give
7886 any guidance on issues of overloading; it only discusses expressions,
7887 and all of the values in these expressions are of the same type.
7888 Some clarification would seem to be in order.</li>
7889 </ul>
7891 <p><i>Additional discussion from Copenhagen:</i></p>
7892 <ul>
7893 <li>It was generally agreed that there is a real defect here: if
7894 the predicate is merely required to be a Strict Weak Ordering, then
7895 it's possible to pass in a function object with an overloaded
7896 operator(), where the version that's actually called does something
7897 completely inappropriate. (Such as returning a random value.)</li>
7899 <li>An alternative formulation was presented in a paper distributed by
7900 David Abrahams at the meeting, "Binary Search with Heterogeneous
7901 Comparison", J16-01/0027 = WG21 N1313: Instead of viewing the
7902 predicate as a Strict Weak Ordering acting on a sorted sequence, view
7903 the predicate/value pair as something that partitions a sequence.
7904 This is almost equivalent to saying that we should view binary search
7905 as if we are given a unary predicate and a sequence, such that f(*p)
7906 is true for all p below a specific point and false for all p above it.
7907 The proposed resolution is based on that alternative formulation.</li>
7908 </ul>
7909 <p><b>Proposed resolution:</b></p>
7911 <p>Change 25.3 [lib.alg.sorting] paragraph 3 from:</p>
7913 <blockquote>
7914 3 For all algorithms that take Compare, there is a version that uses
7915 operator&lt; instead. That is, comp(*i, *j) != false defaults to *i &lt;
7916 *j != false. For the algorithms to work correctly, comp has to
7917 induce a strict weak ordering on the values.
7918 </blockquote>
7920 <p>to:</p>
7922 <blockquote>
7923 3 For all algorithms that take Compare, there is a version that uses
7924 operator&lt; instead. That is, comp(*i, *j) != false defaults to *i
7925 &lt; *j != false. For algorithms other than those described in
7926 lib.alg.binary.search (25.3.3) to work correctly, comp has to induce
7927 a strict weak ordering on the values.
7928 </blockquote>
7930 <p>Add the following paragraph after 25.3 [lib.alg.sorting] paragraph 5:</p>
7932 <blockquote>
7933 -6- A sequence [start, finish) is partitioned with respect to an
7934 expression f(e) if there exists an integer n such that
7935 for all 0 &lt;= i &lt; distance(start, finish), f(*(begin+i)) is true if
7936 and only if i &lt; n.
7937 </blockquote>
7939 <p>Change 25.3.3 [lib.alg.binary.search] paragraph 1 from:</p>
7941 <blockquote>
7942 -1- All of the algorithms in this section are versions of binary
7943 search and assume that the sequence being searched is in order
7944 according to the implied or explicit comparison function. They work
7945 on non-random access iterators minimizing the number of
7946 comparisons, which will be logarithmic for all types of
7947 iterators. They are especially appropriate for random access
7948 iterators, because these algorithms do a logarithmic number of
7949 steps through the data structure. For non-random access iterators
7950 they execute a linear number of steps.
7951 </blockquote>
7953 <p>to:</p>
7955 <blockquote>
7956 -1- All of the algorithms in this section are versions of binary
7957 search and assume that the sequence being searched is partitioned
7958 with respect to an expression formed by binding the search key to
7959 an argument of the implied or explicit comparison function. They
7960 work on non-random access iterators minimizing the number of
7961 comparisons, which will be logarithmic for all types of
7962 iterators. They are especially appropriate for random access
7963 iterators, because these algorithms do a logarithmic number of
7964 steps through the data structure. For non-random access iterators
7965 they execute a linear number of steps.
7966 </blockquote>
7968 <p>Change 25.3.3.1 [lib.lower.bound] paragraph 1 from:</p>
7970 <blockquote>
7971 -1- Requires: Type T is LessThanComparable
7972 (lib.lessthancomparable).
7973 </blockquote>
7975 <p>to:</p>
7977 <blockquote>
7978 -1- Requires: The elements e of [first, last) are partitioned with
7979 respect to the expression e &lt; value or comp(e, value)
7980 </blockquote>
7983 <p>Remove 25.3.3.1 [lib.lower.bound] paragraph 2:</p>
7985 <blockquote>
7986 -2- Effects: Finds the first position into which value can be
7987 inserted without violating the ordering.
7988 </blockquote>
7990 <p>Change 25.3.3.2 [lib.upper.bound] paragraph 1 from:</p>
7992 <blockquote>
7993 -1- Requires: Type T is LessThanComparable (lib.lessthancomparable).
7994 </blockquote>
7996 <p>to:</p>
7998 <blockquote>
7999 -1- Requires: The elements e of [first, last) are partitioned with
8000 respect to the expression !(value &lt; e) or !comp(value, e)
8001 </blockquote>
8003 <p>Remove 25.3.3.2 [lib.upper.bound] paragraph 2:</p>
8005 <blockquote>
8006 -2- Effects: Finds the furthermost position into which value can be
8007 inserted without violating the ordering.
8008 </blockquote>
8010 <p>Change 25.3.3.3 [lib.equal.range] paragraph 1 from:</p>
8012 <blockquote>
8013 -1- Requires: Type T is LessThanComparable
8014 (lib.lessthancomparable).
8015 </blockquote>
8017 <p>to:</p>
8019 <blockquote>
8020 -1- Requires: The elements e of [first, last) are partitioned with
8021 respect to the expressions e &lt; value and !(value &lt; e) or
8022 comp(e, value) and !comp(value, e). Also, for all elements e of
8023 [first, last), e &lt; value implies !(value &lt; e) or comp(e,
8024 value) implies !comp(value, e)
8025 </blockquote>
8027 <p>Change 25.3.3.3 [lib.equal.range] paragraph 2 from:</p>
8029 <blockquote>
8030 -2- Effects: Finds the largest subrange [i, j) such that the value
8031 can be inserted at any iterator k in it without violating the
8032 ordering. k satisfies the corresponding conditions: !(*k &lt; value)
8033 &amp;&amp; !(value &lt; *k) or comp(*k, value) == false &amp;&amp; comp(value, *k) ==
8034 false.
8035 </blockquote>
8037 <p>to:</p>
8039 <pre> -2- Returns:
8040 make_pair(lower_bound(first, last, value),
8041 upper_bound(first, last, value))
8043 make_pair(lower_bound(first, last, value, comp),
8044 upper_bound(first, last, value, comp))
8045 </pre>
8047 <p>Change 25.3.3.3 [lib.binary.search] paragraph 1 from:</p>
8049 <blockquote>
8050 -1- Requires: Type T is LessThanComparable
8051 (lib.lessthancomparable).
8052 </blockquote>
8054 <p>to:</p>
8056 <blockquote>
8057 -1- Requires: The elements e of [first, last) are partitioned with
8058 respect to the expressions e &lt; value and !(value &lt; e) or comp(e,
8059 value) and !comp(value, e). Also, for all elements e of [first,
8060 last), e &lt; value implies !(value &lt; e) or comp(e, value) implies
8061 !comp(value, e)
8062 </blockquote>
8064 <p><i>[Copenhagen: Dave Abrahams provided this wording]</i></p>
8066 <p><i>[Redmond: Minor changes in wording. (Removed "non-negative", and
8067 changed the "other than those described in" wording.) Also, the LWG
8068 decided to accept the "optional" part.]</i></p>
8070 <p><b>Rationale:</b></p>
8071 <p>The proposed resolution reinterprets binary search. Instead of
8072 thinking about searching for a value in a sorted range, we view that
8073 as an important special case of a more general algorithm: searching
8074 for the partition point in a partitioned range.</p>
8076 <p>We also add a guarantee that the old wording did not: we ensure
8077 that the upper bound is no earlier than the lower bound, that
8078 the pair returned by equal_range is a valid range, and that the first
8079 part of that pair is the lower bound.</p>
8080 <hr>
8081 <a name="271"><h3>271.&nbsp;basic_iostream missing typedefs</h3></a><p><b>Section:</b>&nbsp;27.6.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostreamclass"> [lib.iostreamclass]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Nov 2000</p>
8083 Class template basic_iostream has no typedefs. The typedefs it
8084 inherits from its base classes can't be used, since (for example)
8085 basic_iostream&lt;T&gt;::traits_type is ambiguous.
8086 </p>
8087 <p><b>Proposed resolution:</b></p>
8089 <p>Add the following to basic_iostream's class synopsis in
8090 27.6.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostreamclass"> [lib.iostreamclass]</a>, immediately after <tt>public</tt>:</p>
8092 <pre> // types:
8093 typedef charT char_type;
8094 typedef typename traits::int_type int_type;
8095 typedef typename traits::pos_type pos_type;
8096 typedef typename traits::off_type off_type;
8097 typedef traits traits_type;
8098 </pre>
8099 <hr>
8100 <a name="272"><h3>272.&nbsp;Missing parentheses around subexpression</h3></a><p><b>Section:</b>&nbsp;27.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostate.flags"> [lib.iostate.flags]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Nov 2000</p>
8102 27.4.4.3, p4 says about the postcondition of the function: If
8103 rdbuf()!=0 then state == rdstate(); otherwise
8104 rdstate()==state|ios_base::badbit.
8105 </p>
8108 The expression on the right-hand-side of the operator==() needs to be
8109 parenthesized in order for the whole expression to ever evaluate to
8110 anything but non-zero.
8111 </p>
8112 <p><b>Proposed resolution:</b></p>
8114 Add parentheses like so: rdstate()==(state|ios_base::badbit).
8115 </p>
8116 <hr>
8117 <a name="273"><h3>273.&nbsp;Missing ios_base qualification on members of a dependent class</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Nov 2000</p>
8118 <p>27.5.2.4.2, p4, and 27.8.1.6, p2, 27.8.1.7, p3, 27.8.1.9, p2,
8119 27.8.1.10, p3 refer to in and/or out w/o ios_base:: qualification.
8120 That's incorrect since the names are members of a dependent base
8121 class (14.6.2 [temp.dep]) and thus not visible.</p>
8122 <p><b>Proposed resolution:</b></p>
8123 <p>Qualify the names with the name of the class of which they are
8124 members, i.e., ios_base.</p>
8125 <hr>
8126 <a name="274"><h3>274.&nbsp;a missing/impossible 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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Nov 2000</p>
8128 I see that table 31 in 20.1.5, p3 allows T in std::allocator&lt;T&gt; to be of
8129 any type. But the synopsis in 20.4.1 calls for allocator&lt;&gt;::address() to
8130 be overloaded on reference and const_reference, which is ill-formed for
8131 all T = const U. In other words, this won't work:
8132 </p>
8135 template class std::allocator&lt;const int&gt;;
8136 </p>
8139 The obvious solution is to disallow specializations of allocators on
8140 const types. However, while containers' elements are required to be
8141 assignable (which rules out specializations on const T's), I think that
8142 allocators might perhaps be potentially useful for const values in other
8143 contexts. So if allocators are to allow const types a partial
8144 specialization of std::allocator&lt;const T&gt; would probably have to be
8145 provided.
8146 </p>
8147 <p><b>Proposed resolution:</b></p>
8148 <p>Change the text in row 1, column 2 of table 32 in 20.1.5, p3 from</p>
8150 <blockquote>
8151 any type
8152 </blockquote>
8154 <p>to</p>
8155 <blockquote>
8156 any non-const, non-reference type
8157 </blockquote>
8159 <p><i>[Redmond: previous proposed resolution was "any non-const,
8160 non-volatile, non-reference type". Got rid of the "non-volatile".]</i></p>
8162 <p><b>Rationale:</b></p>
8164 Two resolutions were originally proposed: one that partially
8165 specialized std::allocator for const types, and one that said an
8166 allocator's value type may not be const. The LWG chose the second.
8167 The first wouldn't be appropriate, because allocators are intended for
8168 use by containers, and const value types don't work in containers.
8169 Encouraging the use of allocators with const value types would only
8170 lead to unsafe code.
8171 </p>
8173 The original text for proposed resolution 2 was modified so that it
8174 also forbids volatile types and reference types.
8175 </p>
8177 <p><i>[Curaçao: LWG double checked and believes volatile is correctly
8178 excluded from the PR.]</i></p>
8180 <hr>
8181 <a name="275"><h3>275.&nbsp;Wrong type in num_get::get() overloads</h3></a><p><b>Section:</b>&nbsp;22.2.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.members"> [lib.facet.num.get.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;02 Nov 2000</p>
8183 In 22.2.2.1.1, we have a list of overloads for num_get&lt;&gt;::get().
8184 There are eight overloads, all of which are identical except for the
8185 last parameter. The overloads are:
8186 </p>
8187 <ul>
8188 <li> long&amp; </li>
8189 <li> unsigned short&amp; </li>
8190 <li> unsigned int&amp; </li>
8191 <li> unsigned long&amp; </li>
8192 <li> short&amp; </li>
8193 <li> double&amp; </li>
8194 <li> long double&amp; </li>
8195 <li> void*&amp; </li>
8196 </ul>
8199 There is a similar list, in 22.2.2.1.2, of overloads for
8200 num_get&lt;&gt;::do_get(). In this list, the last parameter has
8201 the types:
8202 </p>
8203 <ul>
8204 <li> long&amp; </li>
8205 <li> unsigned short&amp; </li>
8206 <li> unsigned int&amp; </li>
8207 <li> unsigned long&amp; </li>
8208 <li> float&amp; </li>
8209 <li> double&amp; </li>
8210 <li> long double&amp; </li>
8211 <li> void*&amp; </li>
8212 </ul>
8215 These two lists are not identical. They should be, since
8216 <tt>get</tt> is supposed to call <tt>do_get</tt> with exactly
8217 the arguments it was given.
8218 </p>
8219 <p><b>Proposed resolution:</b></p>
8220 <p>In 22.2.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.get.members"> [lib.facet.num.get.members]</a>, change</p>
8221 <pre> iter_type get(iter_type in, iter_type end, ios_base&amp; str,
8222 ios_base::iostate&amp; err, short&amp; val) const;
8223 </pre>
8224 <p>to</p>
8225 <pre> iter_type get(iter_type in, iter_type end, ios_base&amp; str,
8226 ios_base::iostate&amp; err, float&amp; val) const;
8227 </pre>
8228 <hr>
8229 <a name="276"><h3>276.&nbsp;Assignable requirement for container value type overly strict</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Peter Dimov&nbsp; <b>Date:</b>&nbsp;07 Nov 2000</p>
8231 23.1/3 states that the objects stored in a container must be
8232 Assignable. 23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>, paragraph 2,
8233 states that map satisfies all requirements for a container, while in
8234 the same time defining value_type as pair&lt;const Key, T&gt; - a type
8235 that is not Assignable.
8236 </p>
8239 It should be noted that there exists a valid and non-contradictory
8240 interpretation of the current text. The wording in 23.1/3 avoids
8241 mentioning value_type, referring instead to "objects stored in a
8242 container." One might argue that map does not store objects of
8243 type map::value_type, but of map::mapped_type instead, and that the
8244 Assignable requirement applies to map::mapped_type, not
8245 map::value_type.
8246 </p>
8249 However, this makes map a special case (other containers store objects of
8250 type value_type) and the Assignable requirement is needlessly restrictive in
8251 general.
8252 </p>
8255 For example, the proposed resolution of active library issue
8256 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103">103</a> is to make set::iterator a constant iterator; this
8257 means that no set operations can exploit the fact that the stored
8258 objects are Assignable.
8259 </p>
8262 This is related to, but slightly broader than, closed issue
8263 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#140">140</a>.
8264 </p>
8265 <p><b>Proposed resolution:</b></p>
8266 <p>23.1/3: Strike the trailing part of the sentence:</p>
8267 <blockquote>
8268 , and the additional requirements of Assignable types from 23.1/3
8269 </blockquote>
8270 <p>so that it reads:</p>
8271 <blockquote>
8272 -3- The type of objects stored in these components must meet the
8273 requirements of CopyConstructible types (lib.copyconstructible).
8274 </blockquote>
8276 <p>23.1/4: Modify to make clear that this requirement is not for all
8277 containers. Change to:</p>
8279 <blockquote>
8280 -4- Table 64 defines the Assignable requirement. Some containers
8281 require this property of the types to be stored in the container. T is
8282 the type used to instantiate the container. t is a value of T, and u is
8283 a value of (possibly const) T.
8284 </blockquote>
8286 <p>23.1, Table 65: in the first row, change "T is Assignable" to "T is
8287 CopyConstructible".</p>
8289 <p>23.2.1/2: Add sentence for Assignable requirement. Change to:</p>
8291 <blockquote>
8292 -2- A deque satisfies all of the requirements of a container and of a
8293 reversible container (given in tables in lib.container.requirements) and
8294 of a sequence, including the optional sequence requirements
8295 (lib.sequence.reqmts). In addition to the requirements on the stored
8296 object described in 23.1[lib.container.requirements], the stored object
8297 must also meet the requirements of Assignable. Descriptions are
8298 provided here only for operations on deque that are not described in one
8299 of these tables or for operations where there is additional semantic
8300 information.
8301 </blockquote>
8303 <p>23.2.2/2: Add Assignable requirement to specific methods of list.
8304 Change to:</p>
8306 <blockquote>
8307 <p>-2- A list satisfies all of the requirements of a container and of a
8308 reversible container (given in two tables in lib.container.requirements)
8309 and of a sequence, including most of the the optional sequence
8310 requirements (lib.sequence.reqmts). The exceptions are the operator[]
8311 and at member functions, which are not provided.
8313 [Footnote: These member functions are only provided by containers whose
8314 iterators are random access iterators. --- end foonote]
8315 </p>
8317 <p>list does not require the stored type T to be Assignable unless the
8318 following methods are instantiated:
8320 [Footnote: Implementors are permitted but not required to take advantage
8321 of T's Assignable properties for these methods. -- end foonote]
8322 </p>
8323 <pre> list&lt;T,Allocator&gt;&amp; operator=(const list&lt;T,Allocator&gt;&amp; x );
8324 template &lt;class InputIterator&gt;
8325 void assign(InputIterator first, InputIterator last);
8326 void assign(size_type n, const T&amp; t);
8327 </pre>
8330 <p>Descriptions are provided here only for operations on list that are not
8331 described in one of these tables or for operations where there is
8332 additional semantic information.</p>
8333 </blockquote>
8335 <p>23.2.4/2: Add sentence for Assignable requirement. Change to:</p>
8337 <blockquote>
8338 -2- A vector satisfies all of the requirements of a container and of a
8339 reversible container (given in two tables in lib.container.requirements)
8340 and of a sequence, including most of the optional sequence requirements
8341 (lib.sequence.reqmts). The exceptions are the push_front and pop_front
8342 member functions, which are not provided. In addition to the
8343 requirements on the stored object described in
8344 23.1[lib.container.requirements], the stored object must also meet the
8345 requirements of Assignable. Descriptions are provided here only for
8346 operations on vector that are not described in one of these tables or
8347 for operations where there is additional semantic information.
8348 </blockquote>
8349 <p><b>Rationale:</b></p>
8350 <p>list, set, multiset, map, multimap are able to store non-Assignables.
8351 However, there is some concern about <tt>list&lt;T&gt;</tt>:
8352 although in general there's no reason for T to be Assignable, some
8353 implementations of the member functions <tt>operator=</tt> and
8354 <tt>assign</tt> do rely on that requirement. The LWG does not want
8355 to forbid such implementations.</p>
8357 <p>Note that the type stored in a standard container must still satisfy
8358 the requirements of the container's allocator; this rules out, for
8359 example, such types as "const int". See issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#274">274</a>
8360 for more details.
8361 </p>
8363 <p>In principle we could also relax the "Assignable" requirement for
8364 individual <tt>vector</tt> member functions, such as
8365 <tt>push_back</tt>. However, the LWG did not see great value in such
8366 selective relaxation. Doing so would remove implementors' freedom to
8367 implement <tt>vector::push_back</tt> in terms of
8368 <tt>vector::insert</tt>.</p>
8370 <hr>
8371 <a name="278"><h3>278.&nbsp;What does iterator validity mean?</h3></a><p><b>Section:</b>&nbsp;23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;P.J. Plauger&nbsp; <b>Date:</b>&nbsp;27 Nov 2000</p>
8373 Section 23.2.2.4 [lib.list.ops] states that
8374 </p>
8375 <pre> void splice(iterator position, list&lt;T, Allocator&gt;&amp; x);
8376 </pre>
8378 <i>invalidates</i> all iterators and references to list <tt>x</tt>.
8379 </p>
8382 But what does the C++ Standard mean by "invalidate"? You
8383 can still dereference the iterator to a spliced list element, but
8384 you'd better not use it to delimit a range within the original
8385 list. For the latter operation, it has definitely lost some of its
8386 validity.
8387 </p>
8390 If we accept the proposed resolution to issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#250">250</a>,
8391 then we'd better clarify that a "valid" iterator need no
8392 longer designate an element within the same container as it once did.
8393 We then have to clarify what we mean by invalidating a past-the-end
8394 iterator, as when a vector or string grows by reallocation. Clearly,
8395 such an iterator has a different kind of validity. Perhaps we should
8396 introduce separate terms for the two kinds of "validity."
8397 </p>
8398 <p><b>Proposed resolution:</b></p>
8399 <p>Add the following text to the end of section 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>,
8400 after paragraph 5:</p>
8401 <blockquote>
8402 An <i>invalid</i> iterator is an iterator that may be
8403 singular. [Footnote: This definition applies to pointers, since
8404 pointers are iterators. The effect of dereferencing an iterator that
8405 has been invalidated is undefined.]
8406 </blockquote>
8408 <p><i>[post-Copenhagen: Matt provided wording.]</i></p>
8410 <p><i>[Redmond: General agreement with the intent, some objections to
8411 the wording. Dave provided new wording.]</i></p>
8412 <p><b>Rationale:</b></p>
8413 <p>This resolution simply defines a term that the Standard uses but
8414 never defines, "invalid", in terms of a term that is defined,
8415 "singular".</p>
8417 <p>Why do we say "may be singular", instead of "is singular"? That's
8418 becuase a valid iterator is one that is known to be nonsingular.
8419 Invalidating an iterator means changing it in such a way that it's
8420 no longer known to be nonsingular. An example: inserting an
8421 element into the middle of a vector is correctly said to invalidate
8422 all iterators pointing into the vector. That doesn't necessarily
8423 mean they all become singular.</p>
8424 <hr>
8425 <a name="280"><h3>280.&nbsp;Comparison of reverse_iterator to const reverse_iterator</h3></a><p><b>Section:</b>&nbsp;24.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iterators"> [lib.reverse.iterators]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Cleary&nbsp; <b>Date:</b>&nbsp;27 Nov 2000</p>
8427 This came from an email from Steve Cleary to Fergus in reference to
8428 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179">179</a>. The library working group briefly discussed
8429 this in Toronto and believed it should be a separate issue. There was
8430 also some reservations about whether this was a worthwhile problem to
8431 fix.
8432 </p>
8435 Steve said: "Fixing reverse_iterator. std::reverse_iterator can
8436 (and should) be changed to preserve these additional
8437 requirements." He also said in email that it can be done without
8438 breaking user's code: "If you take a look at my suggested
8439 solution, reverse_iterator doesn't have to take two parameters; there
8440 is no danger of breaking existing code, except someone taking the
8441 address of one of the reverse_iterator global operator functions, and
8442 I have to doubt if anyone has ever done that. . . <i>But</i>, just in
8443 case they have, you can leave the old global functions in as well --
8444 they won't interfere with the two-template-argument functions. With
8445 that, I don't see how <i>any</i> user code could break."
8446 </p>
8447 <p><b>Proposed resolution:</b></p>
8449 <b>Section:</b> 24.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iterator"> [lib.reverse.iterator]</a>
8450 add/change the following declarations:</p>
8451 <pre> A) Add a templated assignment operator, after the same manner
8452 as the templated copy constructor, i.e.:
8454 template &lt; class U &gt;
8455 reverse_iterator &lt; Iterator &gt;&amp; operator=(const reverse_iterator&lt; U &gt;&amp; u);
8457 B) Make all global functions (except the operator+) have
8458 two template parameters instead of one, that is, for
8459 operator ==, !=, &lt;, &gt;, &lt;=, &gt;=, - replace:
8461 template &lt; class Iterator &gt;
8462 typename reverse_iterator&lt; Iterator &gt;::difference_type operator-(
8463 const reverse_iterator&lt; Iterator &gt;&amp; x,
8464 const reverse_iterator&lt; Iterator &gt;&amp; y);
8466 with:
8468 template &lt; class Iterator1, class Iterator2 &gt;
8469 typename reverse_iterator &lt; Iterator1 &gt;::difference_type operator-(
8470 const reverse_iterator &lt; Iterator1 &gt; &amp; x,
8471 const reverse_iterator &lt; Iterator2 &gt; &amp; y);
8472 </pre>
8474 Also make the addition/changes for these signatures in
8475 24.4.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.ops"> [lib.reverse.iter.ops]</a>.
8476 </p>
8478 <p><i>[
8479 Copenhagen: The LWG is concerned that the proposed resolution
8480 introduces new overloads. Experience shows that introducing
8481 overloads is always risky, and that it would be inappropriate to
8482 make this change without implementation experience. It may be
8483 desirable to provide this feature in a different way.
8484 ]</i></p>
8486 <p><i>[
8487 Lillehammer: We now have implementation experience, and agree that
8488 this solution is safe and correct.
8489 ]</i></p>
8491 <hr>
8492 <a name="281"><h3>281.&nbsp;std::min() and max() requirements overly restrictive</h3></a><p><b>Section:</b>&nbsp;25.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.min.max"> [lib.alg.min.max]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Dec 2000</p>
8493 <p>The requirements in 25.3.7, p1 and 4 call for T to satisfy the
8494 requirements of <tt>LessThanComparable</tt> (20.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.lessthancomparable"> [lib.lessthancomparable]</a>)
8495 and <tt>CopyConstructible</tt> (20.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.copyconstructible"> [lib.copyconstructible]</a>).
8496 Since the functions take and return their arguments and result by
8497 const reference, I believe the <tt>CopyConstructible</tt> requirement
8498 is unnecessary.
8499 </p>
8500 <p><b>Proposed resolution:</b></p>
8501 <p>Remove the <tt>CopyConstructible</tt> requirement. Specifically, replace
8502 25.3.7, p1 with</p>
8503 <p><b>-1- Requires:</b> Type T is <tt>LessThanComparable</tt>
8504 (20.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.lessthancomparable"> [lib.lessthancomparable]</a>).
8505 </p>
8506 <p>and replace 25.3.7, p4 with</p>
8507 <p><b>-4- Requires:</b> Type T is <tt>LessThanComparable</tt>
8508 (20.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.lessthancomparable"> [lib.lessthancomparable]</a>).
8509 </p>
8510 <hr>
8511 <a name="282"><h3>282.&nbsp;What types does numpunct grouping refer to?</h3></a><p><b>Section:</b>&nbsp;22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;5 Dec 2000</p>
8513 Paragraph 16 mistakenly singles out integral types for inserting
8514 thousands_sep() characters. This conflicts with the syntax for floating
8515 point numbers described under 22.2.3.1/2.
8516 </p>
8517 <p><b>Proposed resolution:</b></p>
8518 <p>Change paragraph 16 from:</p>
8520 <blockquote>
8521 For integral types, punct.thousands_sep() characters are inserted into
8522 the sequence as determined by the value returned by punct.do_grouping()
8523 using the method described in 22.2.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.numpunct.virtuals"> [lib.facet.numpunct.virtuals]</a>.
8524 </blockquote>
8526 <p>To:</p>
8528 <blockquote>
8529 For arithmetic types, punct.thousands_sep() characters are inserted into
8530 the sequence as determined by the value returned by punct.do_grouping()
8531 using the method described in 22.2.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.numpunct.virtuals"> [lib.facet.numpunct.virtuals]</a>.
8532 </blockquote>
8534 <p><i>[
8535 Copenhagen: Opinions were divided about whether this is actually an
8536 inconsistency, but at best it seems to have been unintentional. This
8537 is only an issue for floating-point output: The standard is
8538 unambiguous that implementations must parse thousands_sep characters
8539 when performing floating-point. The standard is also unambiguous that
8540 this requirement does not apply to the "C" locale.
8541 ]</i></p>
8543 <p><i>[
8544 A survey of existing practice is needed; it is believed that some
8545 implementations do insert thousands_sep characters for floating-point
8546 output and others fail to insert thousands_sep characters for
8547 floating-point input even though this is unambiguously required by the
8548 standard.
8549 ]</i></p>
8551 <p><i>[Post-Curaçao: the above proposed resolution is the consensus of
8552 Howard, Bill, Pete, Benjamin, Nathan, Dietmar, Boris, and Martin.]</i></p>
8554 <hr>
8555 <a name="283"><h3>283.&nbsp;std::replace() requirement incorrect/insufficient</h3></a><p><b>Section:</b>&nbsp;25.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.replace"> [lib.alg.replace]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;15 Dec 2000</p>
8557 (revision of the further discussion)
8558 There are a number of problems with the requires clauses for the
8559 algorithms in 25.1 and 25.2. The requires clause of each algorithm
8560 should describe the necessary and sufficient requirements on the inputs
8561 to the algorithm such that the algorithm compiles and runs properly.
8562 Many of the requires clauses fail to do this. Here is a summary of the kinds
8563 of mistakes:
8564 </p>
8566 <ol>
8567 <li>
8568 Use of EqualityComparable, which only puts requirements on a single
8569 type, when in fact an equality operator is required between two
8570 different types, typically either T and the iterator's value type
8571 or between the value types of two different iterators.
8572 </li>
8573 <li>
8574 Use of Assignable for T when in fact what was needed is Assignable
8575 for the value_type of the iterator, and convertability from T to the
8576 value_type of the iterator. Or for output iterators, the requirement
8577 should be that T is writable to the iterator (output iterators do
8578 not have value types).
8579 </li>
8580 </ol>
8583 Here is the list of algorithms that contain mistakes:
8584 </p>
8586 <ul>
8587 <li>25.1.2 std::find</li>
8588 <li>25.1.6 std::count</li>
8589 <li>25.1.8 std::equal</li>
8590 <li>25.1.9 std::search, std::search_n</li>
8591 <li>25.2.4 std::replace, std::replace_copy</li>
8592 <li>25.2.5 std::fill</li>
8593 <li>25.2.7 std::remove, std::remove_copy</li>
8594 </ul>
8597 Also, in the requirements for EqualityComparable, the requirement that
8598 the operator be defined for const objects is lacking.
8599 </p>
8601 <p><b>Proposed resolution:</b></p>
8603 <p>20.1.1 Change p1 from</p>
8605 <p>In Table 28, <tt>T</tt> is a type to be supplied by a C++ program
8606 instantiating a template, <tt>a</tt>, <tt>b</tt>, and <tt>c</tt> are
8607 values of type <tt>T</tt>.
8608 </p>
8610 <p>to</p>
8613 In Table 28, <tt>T</tt> is a type to be supplied by a C++ program
8614 instantiating a template, <tt>a</tt>, <tt>b</tt>, and <tt>c</tt> are
8615 values of type <tt>const T</tt>.
8616 </p>
8618 <p>25 Between p8 and p9</p>
8620 <p>Add the following sentence:</p>
8622 <p>When the description of an algorithm gives an expression such as
8623 <tt>*first == value</tt> for a condition, it is required that the expression
8624 evaluate to either true or false in boolean contexts.</p>
8626 <p>25.1.2 Change p1 by deleting the requires clause.</p>
8628 <p>25.1.6 Change p1 by deleting the requires clause.</p>
8630 <p>25.1.9</p>
8632 <p>Change p4 from</p>
8634 <p>-4- Requires: Type <tt>T</tt> is <tt>EqualityComparable</tt>
8635 (20.1.1), type Size is convertible to integral type (4.7.12.3).
8636 </p>
8638 <p>to</p>
8640 <p>-4- Requires: The type <tt>Size</tt> is convertible to integral
8641 type (4.7.12.3).</p>
8643 <p>25.2.4 Change p1 from</p>
8645 <p>-1- Requires: Type <tt>T</tt> is <tt>Assignable</tt> (23.1 ) (and, for <tt>replace()</tt>, <tt>EqualityComparable</tt> (20.1.1 )).</p>
8647 <p>to</p>
8649 <p>-1- Requires: The expression <tt>*first = new_value</tt> must be valid.</p>
8651 <p>and change p4 from</p>
8653 <p>-4- Requires: Type <tt>T</tt> is <tt>Assignable</tt> (23.1) (and,
8654 for <tt>replace_copy()</tt>, <tt>EqualityComparable</tt>
8655 (20.1.1)). The ranges <tt>[first, last)</tt> and <tt>[result, result +
8656 (last - first))</tt> shall not overlap.</p>
8658 <p>to</p>
8660 <p>-4- Requires: The results of the expressions <tt>*first</tt> and
8661 <tt>new_value</tt> must be writable to the result output iterator. The
8662 ranges <tt>[first, last)</tt> and <tt>[result, result + (last -
8663 first))</tt> shall not overlap.</p>
8666 <p>25.2.5 Change p1 from</p>
8668 <p>-1- Requires: Type <tt>T</tt> is <tt>Assignable</tt> (23.1). The
8669 type <tt>Size</tt> is convertible to an integral type (4.7.12.3).</p>
8671 <p>to</p>
8673 <p>-1- Requires: The expression <tt>value</tt> must be is writable to
8674 the output iterator. The type <tt>Size</tt> is convertible to an
8675 integral type (4.7.12.3).</p>
8677 <p>25.2.7 Change p1 from</p>
8679 <p>-1- Requires: Type <tt>T</tt> is <tt>EqualityComparable</tt> (20.1.1).</p>
8681 <p>to</p>
8684 -1- Requires: The value type of the iterator must be
8685 <tt>Assignable</tt> (23.1).
8686 </p>
8688 <p><b>Rationale:</b></p>
8690 The general idea of the proposed solution is to remove the faulty
8691 requires clauses and let the returns and effects clauses speak for
8692 themselves. That is, the returns clauses contain expressions that must
8693 be valid, and therefore already imply the correct requirements. In
8694 addition, a sentence is added at the beginning of chapter 25 saying
8695 that expressions given as conditions must evaluate to true or false in
8696 a boolean context. An alternative would be to say that the type of
8697 these condition expressions must be literally bool, but that would be
8698 imposing a greater restriction that what the standard currently says
8699 (which is convertible to bool).
8700 </p>
8701 <hr>
8702 <a name="284"><h3>284.&nbsp;unportable example in 20.3.7, p6</h3></a><p><b>Section:</b>&nbsp;20.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.pointer.adaptors"> [lib.function.pointer.adaptors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;26 Dec 2000</p>
8703 <p>The example in 20.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.pointer.adaptors"> [lib.function.pointer.adaptors]</a>, p6 shows how to use the C
8704 library function <tt>strcmp()</tt> with the function pointer adapter
8705 <tt>ptr_fun()</tt>. But since it's unspecified whether the C library
8706 functions have <tt>extern "C"</tt> or <tt>extern
8707 "C++"</tt> linkage [17.4.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.using.linkage"> [lib.using.linkage]</a>], and since
8708 function pointers with different the language linkage specifications
8709 (7.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/dcl.html#dcl.link"> [dcl.link]</a>) are incompatible, whether this example is
8710 well-formed is unspecified.
8711 </p>
8712 <p><b>Proposed resolution:</b></p>
8713 <p>Change 20.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.function.pointer.adaptors"> [lib.function.pointer.adaptors]</a> paragraph 6 from:</p>
8714 <blockquote>
8715 <p>[<i>Example:</i></p>
8716 <pre> replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(strcmp), "C")), "C++");
8717 </pre>
8718 <p>replaces each <tt>C</tt> with <tt>C++</tt> in sequence <tt>v</tt>.</p>
8719 </blockquote>
8722 <p>to:</p>
8723 <blockquote>
8724 <p>[<i>Example:</i></p>
8725 <pre> int compare(const char*, const char*);
8726 replace_if(v.begin(), v.end(),
8727 not1(bind2nd(ptr_fun(compare), "abc")), "def");
8728 </pre>
8729 <p>replaces each <tt>abc</tt> with <tt>def</tt> in sequence <tt>v</tt>.</p>
8730 </blockquote>
8732 <p>Also, remove footnote 215 in that same paragraph.</p>
8734 <p><i>[Copenhagen: Minor change in the proposed resolution. Since this
8735 issue deals in part with C and C++ linkage, it was believed to be too
8736 confusing for the strings in the example to be "C" and "C++".
8737 ]</i></p>
8739 <p><i>[Redmond: More minor changes. Got rid of the footnote (which
8740 seems to make a sweeping normative requirement, even though footnotes
8741 aren't normative), and changed the sentence after the footnote so that
8742 it corresponds to the new code fragment.]</i></p>
8744 <hr>
8745 <a name="285"><h3>285.&nbsp;minor editorial errors in fstream ctors</h3></a><p><b>Section:</b>&nbsp;27.8.1.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.cons"> [lib.ifstream.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;31 Dec 2000</p>
8746 <p>27.8.1.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.cons"> [lib.ifstream.cons]</a>, p2, 27.8.1.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ofstream.cons"> [lib.ofstream.cons]</a>, p2, and
8747 27.8.1.12 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstream.cons"> [lib.fstream.cons]</a>, p2 say about the effects of each constructor:
8748 </p>
8750 <p>... If that function returns a null pointer, calls
8751 <tt>setstate(failbit)</tt> (which may throw <tt>ios_base::failure</tt>).
8752 </p>
8754 <p>The parenthetical note doesn't apply since the ctors cannot throw an
8755 exception due to the requirement in 27.4.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.cons"> [lib.basic.ios.cons]</a>, p3
8756 that <tt>exceptions()</tt> be initialized to <tt>ios_base::goodbit</tt>.
8757 </p>
8758 <p><b>Proposed resolution:</b></p>
8760 Strike the parenthetical note from the Effects clause in each of the
8761 paragraphs mentioned above.
8762 </p>
8763 <hr>
8764 <a name="286"><h3>286.&nbsp;&lt;cstdlib&gt; requirements missing size_t typedef</h3></a><p><b>Section:</b>&nbsp;25.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.c.library"> [lib.alg.c.library]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;30 Dec 2000</p>
8766 The &lt;cstdlib&gt; header file contains prototypes for bsearch and
8767 qsort (C++ Standard section 25.4 paragraphs 3 and 4) and other
8768 prototypes (C++ Standard section 21.4 paragraph 1 table 49) that
8769 require the typedef size_t. Yet size_t is not listed in the
8770 &lt;cstdlib&gt; synopsis table 78 in section 25.4.
8771 </p>
8772 <p><b>Proposed resolution:</b></p>
8774 Add the type size_t to Table 78 (section 25.4) and add
8775 the type size_t &lt;cstdlib&gt; to Table 97 (section C.2).
8776 </p>
8777 <p><b>Rationale:</b></p>
8778 <p>Since size_t is in &lt;stdlib.h&gt;, it must also be in &lt;cstdlib&gt;.</p>
8779 <hr>
8780 <a name="288"><h3>288.&nbsp;&lt;cerrno&gt; requirements missing macro EILSEQ</h3></a><p><b>Section:</b>&nbsp;19.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-diagnostics.html#lib.errno"> [lib.errno]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Judy Ward&nbsp; <b>Date:</b>&nbsp;30 Dec 2000</p>
8782 ISO/IEC 9899:1990/Amendment1:1994 Section 4.3 States: "The list
8783 of macros defined in &lt;errno.h&gt; is adjusted to include a new
8784 macro, EILSEQ"
8785 </p>
8788 ISO/IEC 14882:1998(E) section 19.3 does not refer
8789 to the above amendment.
8790 </p>
8792 <p><b>Proposed resolution:</b></p>
8794 Update Table 26 (section 19.3) "Header &lt;cerrno&gt; synopsis"
8795 and Table 95 (section C.2) "Standard Macros" to include EILSEQ.
8796 </p>
8797 <hr>
8798 <a name="291"><h3>291.&nbsp;Underspecification of set algorithms</h3></a><p><b>Section:</b>&nbsp;25.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.set.operations"> [lib.alg.set.operations]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;03 Jan 2001</p>
8800 The standard library contains four algorithms that compute set
8801 operations on sorted ranges: <tt>set_union</tt>, <tt>set_intersection</tt>,
8802 <tt>set_difference</tt>, and <tt>set_symmetric_difference</tt>. Each
8803 of these algorithms takes two sorted ranges as inputs, and writes the
8804 output of the appropriate set operation to an output range. The elements
8805 in the output range are sorted.
8806 </p>
8809 The ordinary mathematical definitions are generalized so that they
8810 apply to ranges containing multiple copies of a given element. Two
8811 elements are considered to be "the same" if, according to an
8812 ordering relation provided by the user, neither one is less than the
8813 other. So, for example, if one input range contains five copies of an
8814 element and another contains three, the output range of <tt>set_union</tt>
8815 will contain five copies, the output range of
8816 <tt>set_intersection</tt> will contain three, the output range of
8817 <tt>set_difference</tt> will contain two, and the output range of
8818 <tt>set_symmetric_difference</tt> will contain two.
8819 </p>
8822 Because two elements can be "the same" for the purposes
8823 of these set algorithms, without being identical in other respects
8824 (consider, for example, strings under case-insensitive comparison),
8825 this raises a number of unanswered questions:
8826 </p>
8828 <ul>
8829 <li>If we're copying an element that's present in both of the
8830 input ranges, which one do we copy it from?</li>
8831 <li>If there are <i>n</i> copies of an element in the relevant
8832 input range, and the output range will contain fewer copies (say
8833 <i>m</i>) which ones do we choose? The first <i>m</i>, or the last
8834 <i>m</i>, or something else?</li>
8835 <li>Are these operations stable? That is, does a run of equivalent
8836 elements appear in the output range in the same order as as it
8837 appeared in the input range(s)?</li>
8838 </ul>
8841 The standard should either answer these questions, or explicitly
8842 say that the answers are unspecified. I prefer the former option,
8843 since, as far as I know, all existing implementations behave the
8844 same way.
8845 </p>
8847 <p><b>Proposed resolution:</b></p>
8849 <p>Add the following to the end of 25.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.set.union"> [lib.set.union]</a> paragraph 5:</p>
8850 <blockquote>
8851 If [first1, last1) contains <i>m</i> elements that are equivalent to
8852 each other and [first2, last2) contains <i>n</i> elements that are
8853 equivalent to them, then max(<i>m</i>, <i>n</i>) of these elements
8854 will be copied to the output range: all <i>m</i> of these elements
8855 from [first1, last1), and the last max(<i>n-m</i>, 0) of them from
8856 [first2, last2), in that order.
8857 </blockquote>
8859 <p>Add the following to the end of 25.3.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.set.intersection"> [lib.set.intersection]</a> paragraph 5:</p>
8860 <blockquote>
8861 If [first1, last1) contains <i>m</i> elements that are equivalent to each
8862 other and [first2, last2) contains <i>n</i> elements that are
8863 equivalent to them, the first min(<i>m</i>, <i>n</i>) of those
8864 elements from [first1, last1) are copied to the output range.
8865 </blockquote>
8867 <p>Add a new paragraph, <b>Notes</b>, after 25.3.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.set.difference"> [lib.set.difference]</a>
8868 paragraph 4:</p>
8869 <blockquote>
8870 If [first1, last1) contains <i>m</i> elements that are equivalent to each
8871 other and [first2, last2) contains <i>n</i> elements that are
8872 equivalent to them, the last max(<i>m-n</i>, 0) elements from
8873 [first1, last1) are copied to the output range.
8874 </blockquote>
8876 <p>Add a new paragraph, <b>Notes</b>, after 25.3.5.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.set.symmetric.difference"> [lib.set.symmetric.difference]</a>
8877 paragraph 4:</p>
8878 <blockquote>
8879 If [first1, last1) contains <i>m</i> elements that are equivalent to
8880 each other and [first2, last2) contains <i>n</i> elements that are
8881 equivalent to them, then |<i>m - n</i>| of those elements will be
8882 copied to the output range: the last <i>m - n</i> of these elements
8883 from [first1, last1) if <i>m</i> &gt; <i>n</i>, and the last <i>n -
8884 m</i> of these elements from [first2, last2) if <i>m</i> &lt; <i>n</i>.
8885 </blockquote>
8887 <p><i>[Santa Cruz: it's believed that this language is clearer than
8888 what's in the Standard. However, it's also believed that the
8889 Standard may already make these guarantees (although not quite in
8890 these words). Bill and Howard will check and see whether they think
8891 that some or all of these changes may be redundant. If so, we may
8892 close this issue as NAD.]</i></p>
8894 <p><b>Rationale:</b></p>
8895 <p>For simple cases, these descriptions are equivalent to what's
8896 already in the Standard. For more complicated cases, they describe
8897 the behavior of existing implementations.</p>
8898 <hr>
8899 <a name="292"><h3>292.&nbsp;effects of a.copyfmt (a)</h3></a><p><b>Section:</b>&nbsp;27.4.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.basic.ios.members"> [lib.basic.ios.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;05 Jan 2001</p>
8900 <p>The Effects clause of the member function <tt>copyfmt()</tt> in
8901 27.4.4.2, p15 doesn't consider the case where the left-hand side
8902 argument is identical to the argument on the right-hand side, that is
8903 <tt>(this == &amp;rhs)</tt>. If the two arguments are identical there
8904 is no need to copy any of the data members or call any callbacks
8905 registered with <tt>register_callback()</tt>. Also, as Howard Hinnant
8906 points out in message c++std-lib-8149 it appears to be incorrect to
8907 allow the object to fire <tt>erase_event</tt> followed by
8908 <tt>copyfmt_event</tt> since the callback handling the latter event
8909 may inadvertently attempt to access memory freed by the former.
8910 </p>
8911 <p><b>Proposed resolution:</b></p>
8912 <p>Change the Effects clause in 27.4.4.2, p15 from</p>
8914 <blockquote>
8915 <b>-15- Effects:</b>Assigns to the member objects of <tt>*this</tt>
8916 the corresponding member objects of <tt>rhs</tt>, except that...
8917 </blockquote>
8919 <p>to</p>
8921 <blockquote>
8922 <b>-15- Effects:</b>If <tt>(this == &amp;rhs)</tt> does nothing. Otherwise
8923 assigns to the member objects of <tt>*this</tt> the corresponding member
8924 objects of <tt>rhs</tt>, except that...
8925 </blockquote>
8926 <hr>
8927 <a name="295"><h3>295.&nbsp;Is abs defined in &lt;cmath&gt;?</h3></a><p><b>Section:</b>&nbsp;26.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.c.math"> [lib.c.math]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Jens Maurer&nbsp; <b>Date:</b>&nbsp;12 Jan 2001</p>
8929 Table 80 lists the contents of the &lt;cmath&gt; header. It does not
8930 list <tt>abs()</tt>. However, 26.5, paragraph 6, which lists added
8931 signatures present in &lt;cmath&gt;, does say that several overloads
8932 of <tt>abs()</tt> should be defined in &lt;cmath&gt;.
8933 </p>
8934 <p><b>Proposed resolution:</b></p>
8936 Add <tt>abs</tt> to Table 80. Also, remove the parenthetical list
8937 of functions "(abs(), div(), rand(), srand())" from 26.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.c.math"> [lib.c.math]</a>,
8938 paragraph 1.
8939 </p>
8941 <p><i>[Copenhagen: Modified proposed resolution so that it also gets
8942 rid of that vestigial list of functions in paragraph 1.]</i></p>
8944 <p><b>Rationale:</b></p>
8945 <p>All this DR does is fix a typo; it's uncontroversial. A
8946 separate question is whether we're doing the right thing in
8947 putting some overloads in &lt;cmath&gt; that we aren't also
8948 putting in &lt;cstdlib&gt;. That's issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#323">323</a>.</p>
8949 <hr>
8950 <a name="297"><h3>297.&nbsp;const_mem_fun_t&lt;&gt;::argument_type should be const T*</h3></a><p><b>Section:</b>&nbsp;20.3.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.member.pointer.adaptors"> [lib.member.pointer.adaptors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;6 Jan 2001</p>
8951 <p>The class templates <tt>const_mem_fun_t</tt> in 20.3.8, p8 and
8952 <tt>const_mem_fun1_t</tt>
8953 in 20.3.8, p9 derive from <tt>unary_function&lt;T*, S&gt;</tt>, and
8954 <tt>binary_function&lt;T*,
8955 A, S&gt;</tt>, respectively. Consequently, their <tt>argument_type</tt>, and
8956 <tt>first_argument_type</tt>
8957 members, respectively, are both defined to be <tt>T*</tt> (non-const).
8958 However, their function call member operator takes a <tt>const T*</tt>
8959 argument. It is my opinion that <tt>argument_type</tt> should be <tt>const
8960 T*</tt> instead, so that one can easily refer to it in generic code. The
8961 example below derived from existing code fails to compile due to the
8962 discrepancy:
8963 </p>
8965 <p><tt>template &lt;class T&gt;</tt>
8966 <br><tt>void foo (typename T::argument_type arg)&nbsp;&nbsp; // #1</tt>
8967 <br><tt>{</tt>
8968 <br><tt>&nbsp;&nbsp;&nbsp; typename T::result_type (T::*pf) (typename
8969 T::argument_type)
8970 const =&nbsp;&nbsp; // #2</tt>
8971 <br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;T::operator();</tt>
8972 <br><tt>}</tt>
8973 </p>
8975 <p><tt>struct X { /* ... */ };</tt></p>
8977 <p><tt>int main ()</tt>
8978 <br><tt>{</tt>
8979 <br><tt>&nbsp;&nbsp;&nbsp; const X x;</tt>
8980 <br><tt>&nbsp;&nbsp;&nbsp; foo&lt;std::const_mem_fun_t&lt;void, X&gt;
8981 &gt;(&amp;x);&nbsp;&nbsp;
8982 // #3</tt>
8983 <br><tt>}</tt>
8984 </p>
8986 <p>#1 <tt>foo()</tt> takes a plain unqualified <tt>X*</tt> as an argument
8987 <br>#2 the type of the pointer is incompatible with the type of the member
8988 function
8989 <br>#3 the address of a constant being passed to a function taking a non-const
8990 <tt>X*</tt>
8991 </p>
8992 <p><b>Proposed resolution:</b></p>
8993 <p>Replace the top portion of the definition of the class template
8994 const_mem_fun_t in 20.3.8, p8
8995 </p>
8996 <p><tt>template &lt;class S, class T&gt; class const_mem_fun_t</tt>
8997 <br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
8998 unary_function&lt;T*, S&gt; {</tt>
8999 </p>
9000 <p>with</p>
9001 <p><tt>template &lt;class S, class T&gt; class const_mem_fun_t</tt>
9002 <br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
9003 unary_function&lt;<b>const</b> T*, S&gt; {</tt>
9004 </p>
9005 <p>Also replace the top portion of the definition of the class template
9006 const_mem_fun1_t in 20.3.8, p9</p>
9007 <p><tt>template &lt;class S, class T, class A&gt; class const_mem_fun1_t</tt>
9008 <br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
9009 binary_function&lt;T*, A, S&gt; {</tt>
9010 </p>
9011 <p>with</p>
9012 <p><tt>template &lt;class S, class T, class A&gt; class const_mem_fun1_t</tt>
9013 <br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : public
9014 binary_function&lt;<b>const</b> T*, A, S&gt; {</tt>
9015 </p>
9016 <p><b>Rationale:</b></p>
9017 <p>This is simply a contradiction: the <tt>argument_type</tt> typedef,
9018 and the argument type itself, are not the same.</p>
9019 <hr>
9020 <a name="298"><h3>298.&nbsp;::operator delete[] requirement incorrect/insufficient</h3></a><p><b>Section:</b>&nbsp;18.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.array"> [lib.new.delete.array]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;John A. Pedretti&nbsp; <b>Date:</b>&nbsp;10 Jan 2001</p>
9022 The default behavior of <tt>operator delete[]</tt> described in 18.4.1.2, p12 -
9023 namely that for non-null value of <i>ptr</i>, the operator reclaims storage
9024 allocated by the earlier call to the default <tt>operator new[]</tt> - is not
9025 correct in all cases. Since the specified <tt>operator new[]</tt> default
9026 behavior is to call <tt>operator new</tt> (18.4.1.2, p4, p8), which can be
9027 replaced, along with <tt>operator delete</tt>, by the user, to implement their
9028 own memory management, the specified default behavior of<tt> operator
9029 delete[]</tt> must be to call <tt>operator delete</tt>.
9030 </p>
9031 <p><b>Proposed resolution:</b></p>
9032 <p>Change 18.4.1.2, p12 from</p>
9033 <blockquote>
9034 <b>-12-</b> <b>Default behavior:</b>
9035 <ul>
9036 <li>
9037 For a null value of <i><tt>ptr</tt></i> , does nothing.
9038 </li>
9039 <li>
9040 Any other value of <i><tt>ptr</tt></i> shall be a value returned
9041 earlier by a call to the default <tt>operator new[](std::size_t)</tt>.
9042 [Footnote: The value must not have been invalidated by an intervening
9043 call to <tt>operator delete[](void*)</tt> (17.4.3.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.arguments"> [lib.res.on.arguments]</a>).
9044 --- end footnote]
9045 For such a non-null value of <i><tt>ptr</tt></i> , reclaims storage
9046 allocated by the earlier call to the default <tt>operator new[]</tt>.
9047 </li>
9048 </ul>
9049 </blockquote>
9051 <p>to</p>
9053 <blockquote>
9054 <b>-12-</b> <b>Default behavior: </b>Calls <tt>operator
9055 delete(</tt><i>ptr</i>)
9056 or <tt>operator delete(<i>ptr</i>, std::nothrow)</tt> respectively.
9057 </blockquote>
9058 <p>and expunge paragraph 13.</p>
9059 <hr>
9060 <a name="300"><h3>300.&nbsp;list::merge() specification incomplete</h3></a><p><b>Section:</b>&nbsp;23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;John Pedretti&nbsp; <b>Date:</b>&nbsp;23 Jan 2001</p>
9062 The "Effects" clause for list::merge() (23.2.2.4, p23)
9063 appears to be incomplete: it doesn't cover the case where the argument
9064 list is identical to *this (i.e., this == &amp;x). The requirement in the
9065 note in p24 (below) is that x be empty after the merge which is surely
9066 unintended in this case.
9067 </p>
9068 <p><b>Proposed resolution:</b></p>
9069 <p>In 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, replace paragraps 23-25 with:</p>
9070 <blockquote>
9072 23 Effects: if (&amp;x == this) does nothing; otherwise, merges the two
9073 sorted ranges [begin(), end()) and [x.begin(), x.end()). The result
9074 is a range in which the elements will be sorted in non-decreasing
9075 order according to the ordering defined by comp; that is, for every
9076 iterator i in the range other than the first, the condition comp(*i,
9077 *(i - 1)) will be false.
9078 </p>
9081 24 Notes: Stable: if (&amp;x != this), then for equivalent elements in the
9082 two original ranges, the elements from the original range [begin(),
9083 end()) always precede the elements from the original range [x.begin(),
9084 x.end()). If (&amp;x != this) the range [x.begin(), x.end()) is empty
9085 after the merge.
9086 </p>
9089 25 Complexity: At most size() + x.size() - 1 applications of comp if
9090 (&amp;x ! = this); otherwise, no applications of comp are performed. If
9091 an exception is thrown other than by a comparison there are no
9092 effects.
9093 </p>
9095 </blockquote>
9097 <p><i>[Copenhagen: The original proposed resolution did not fix all of
9098 the problems in 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, p22-25. Three different
9099 paragraphs (23, 24, 25) describe the effects of <tt>merge</tt>.
9100 Changing p23, without changing the other two, appears to introduce
9101 contradictions. Additionally, "merges the argument list into the
9102 list" is excessively vague.]</i></p>
9104 <p><i>[Post-Curaçao: Robert Klarer provided new wording.]</i></p>
9106 <hr>
9107 <a name="301"><h3>301.&nbsp;basic_string template ctor effects clause omits allocator argument</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;27 Jan 2001</p>
9109 The effects clause for the basic_string template ctor in 21.3.1, p15
9110 leaves out the third argument of type Allocator. I believe this to be
9111 a mistake.
9112 </p>
9113 <p><b>Proposed resolution:</b></p>
9114 <p>Replace</p>
9116 <blockquote>
9117 <p><b>-15- Effects:</b> If <i><tt>InputIterator</tt></i> is an integral
9118 type, equivalent to</p>
9120 <blockquote><tt>basic_string(static_cast&lt;size_type&gt;(begin),
9121 static_cast&lt;value_type&gt;(end))</tt></blockquote>
9122 </blockquote>
9124 <p>with</p>
9126 <blockquote>
9127 <p><b>-15- Effects:</b> If <i><tt>InputIterator</tt></i> is an integral
9128 type, equivalent to</p>
9130 <blockquote><tt>basic_string(static_cast&lt;size_type&gt;(begin),
9131 static_cast&lt;value_type&gt;(end), <b>a</b>)</tt></blockquote>
9132 </blockquote>
9133 <hr>
9134 <a name="303"><h3>303.&nbsp;Bitset input operator underspecified</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;5 Feb 2001</p>
9136 In 23.3.5.3, we are told that <tt>bitset</tt>'s input operator
9137 "Extracts up to <i>N</i> (single-byte) characters from
9138 <i>is</i>.", where <i>is</i> is a stream of type
9139 <tt>basic_istream&lt;charT, traits&gt;</tt>.
9140 </p>
9143 The standard does not say what it means to extract single byte
9144 characters from a stream whose character type, <tt>charT</tt>, is in
9145 general not a single-byte character type. Existing implementations
9146 differ.
9147 </p>
9150 A reasonable solution will probably involve <tt>widen()</tt> and/or
9151 <tt>narrow()</tt>, since they are the supplied mechanism for
9152 converting a single character between <tt>char</tt> and
9153 arbitrary <tt>charT</tt>.
9154 </p>
9156 <p>Narrowing the input characters is not the same as widening the
9157 literals <tt>'0'</tt> and <tt>'1'</tt>, because there may be some
9158 locales in which more than one wide character maps to the narrow
9159 character <tt>'0'</tt>. Narrowing means that alternate
9160 representations may be used for bitset input, widening means that
9161 they may not be.</p>
9163 <p>Note that for numeric input, <tt>num_get&lt;&gt;</tt>
9164 (22.2.2.1.2/8) compares input characters to widened version of narrow
9165 character literals.</p>
9167 <p>From Pete Becker, in c++std-lib-8224:</p>
9168 <blockquote>
9170 Different writing systems can have different representations for the
9171 digits that represent 0 and 1. For example, in the Unicode representation
9172 of the Devanagari script (used in many of the Indic languages) the digit 0
9173 is 0x0966, and the digit 1 is 0x0967. Calling narrow would translate those
9174 into '0' and '1'. But Unicode also provides the ASCII values 0x0030 and
9175 0x0031 for for the Latin representations of '0' and '1', as well as code
9176 points for the same numeric values in several other scripts (Tamil has no
9177 character for 0, but does have the digits 1-9), and any of these values
9178 would also be narrowed to '0' and '1'.
9179 </p>
9181 <p>...</p>
9184 It's fairly common to intermix both native and Latin
9185 representations of numbers in a document. So I think the rule has to be
9186 that if a wide character represents a digit whose value is 0 then the bit
9187 should be cleared; if it represents a digit whose value is 1 then the bit
9188 should be set; otherwise throw an exception. So in a Devanagari locale,
9189 both 0x0966 and 0x0030 would clear the bit, and both 0x0967 and 0x0031
9190 would set it. Widen can't do that. It would pick one of those two values,
9191 and exclude the other one.
9192 </p>
9194 </blockquote>
9196 <p>From Jens Maurer, in c++std-lib-8233:</p>
9198 <blockquote>
9200 Whatever we decide, I would find it most surprising if
9201 bitset conversion worked differently from int conversion
9202 with regard to alternate local representations of
9203 numbers.
9204 </p>
9206 <p>Thus, I think the options are:</p>
9207 <ul>
9208 <li> Have a new defect issue for 22.2.2.1.2/8 so that it will
9209 require the use of narrow().</li>
9211 <li> Have a defect issue for bitset() which describes clearly
9212 that widen() is to be used.</li>
9213 </ul>
9214 </blockquote>
9215 <p><b>Proposed resolution:</b></p>
9217 <p>Replace the first two sentences of paragraph 5 with:</p>
9219 <blockquote>
9220 Extracts up to <i>N</i> characters from <i>is</i>. Stores these
9221 characters in a temporary object <i>str</i> of type
9222 <tt>basic_string&lt;charT, traits&gt;</tt>, then evaluates the
9223 expression <tt><i>x</i> = bitset&lt;N&gt;(<i>str</i>)</tt>.
9224 </blockquote>
9226 <p>Replace the third bullet item in paragraph 5 with:</p>
9227 <ul><li>
9228 the next input character is neither <tt><i>is</i>.widen(0)</tt>
9229 nor <tt><i>is</i>.widen(1)</tt> (in which case the input character
9230 is not extracted).
9231 </li></ul>
9233 <p><b>Rationale:</b></p>
9234 <p>Input for <tt>bitset</tt> should work the same way as numeric
9235 input. Using <tt>widen</tt> does mean that alternative digit
9236 representations will not be recognized, but this was a known
9237 consequence of the design choice.</p>
9238 <hr>
9239 <a name="305"><h3>305.&nbsp;Default behavior of codecvt&lt;wchar_t, char, mbstate_t&gt;::length()</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;24 Jan 2001</p>
9240 <p>22.2.1.5/3 introduces codecvt in part with:</p>
9242 <blockquote>
9243 codecvt&lt;wchar_t,char,mbstate_t&gt; converts between the native
9244 character sets for tiny and wide characters. Instantiations on
9245 mbstate_t perform conversion between encodings known to the library
9246 implementor.
9247 </blockquote>
9249 <p>But 22.2.1.5.2/10 describes do_length in part with:</p>
9251 <blockquote>
9252 ... codecvt&lt;wchar_t, char, mbstate_t&gt; ... return(s) the lesser of max and
9253 (from_end-from).
9254 </blockquote>
9257 The semantics of do_in and do_length are linked. What one does must
9258 be consistent with what the other does. 22.2.1.5/3 leads me to
9259 believe that the vendor is allowed to choose the algorithm that
9260 codecvt&lt;wchar_t,char,mbstate_t&gt;::do_in performs so that it makes
9261 his customers happy on a given platform. But 22.2.1.5.2/10 explicitly
9262 says what codecvt&lt;wchar_t,char,mbstate_t&gt;::do_length must
9263 return. And thus indirectly specifies the algorithm that
9264 codecvt&lt;wchar_t,char,mbstate_t&gt;::do_in must perform. I believe
9265 that this is not what was intended and is a defect.
9266 </p>
9268 <p>Discussion from the -lib reflector:
9270 <br>This proposal would have the effect of making the semantics of
9271 all of the virtual functions in <tt>codecvt&lt;wchar_t, char,
9272 mbstate_t&gt;</tt> implementation specified. Is that what we want, or
9273 do we want to mandate specific behavior for the base class virtuals
9274 and leave the implementation specified behavior for the codecvt_byname
9275 derived class? The tradeoff is that former allows implementors to
9276 write a base class that actually does something useful, while the
9277 latter gives users a way to get known and specified---albeit
9278 useless---behavior, and is consistent with the way the standard
9279 handles other facets. It is not clear what the original intention
9280 was.</p>
9283 Nathan has suggest a compromise: a character that is a widened version
9284 of the characters in the basic execution character set must be
9285 converted to a one-byte sequence, but there is no such requirement
9286 for characters that are not part of the basic execution character set.
9287 </p>
9288 <p><b>Proposed resolution:</b></p>
9290 Change 22.2.1.5.2/5 from:
9291 </p>
9293 The instantiations required in Table 51 (lib.locale.category), namely
9294 codecvt&lt;wchar_t,char,mbstate_t&gt; and
9295 codecvt&lt;char,char,mbstate_t&gt;, store no characters. Stores no more
9296 than (to_limit-to) destination elements. It always leaves the to_next
9297 pointer pointing one beyond the last element successfully stored.
9298 </p>
9301 </p>
9303 Stores no more than (to_limit-to) destination elements, and leaves the
9304 to_next pointer pointing one beyond the last element successfully
9305 stored. codecvt&lt;char,char,mbstate_t&gt; stores no characters.
9306 </p>
9308 <p>Change 22.2.1.5.2/10 from:</p>
9310 <blockquote>
9311 -10- Returns: (from_next-from) where from_next is the largest value in
9312 the range [from,from_end] such that the sequence of values in the
9313 range [from,from_next) represents max or fewer valid complete
9314 characters of type internT. The instantiations required in Table 51
9315 (21.1.1.1.1), namely codecvt&lt;wchar_t, char, mbstate_t&gt; and
9316 codecvt&lt;char, char, mbstate_t&gt;, return the lesser of max and
9317 (from_end-from).
9318 </blockquote>
9320 <p>to:</p>
9322 <blockquote>
9323 -10- Returns: (from_next-from) where from_next is the largest value in
9324 the range [from,from_end] such that the sequence of values in the range
9325 [from,from_next) represents max or fewer valid complete characters of
9326 type internT. The instantiation codecvt&lt;char, char, mbstate_t&gt; returns
9327 the lesser of max and (from_end-from).
9328 </blockquote>
9330 <p><i>[Redmond: Nathan suggested an alternative resolution: same as
9331 above, but require that, in the default encoding, a character from the
9332 basic execution character set would map to a single external
9333 character. The straw poll was 8-1 in favor of the proposed
9334 resolution.]</i></p>
9336 <p><b>Rationale:</b></p>
9337 <p>The default encoding should be whatever users of a given platform
9338 would expect to be the most natural. This varies from platform to
9339 platform. In many cases there is a preexisting C library, and users
9340 would expect the default encoding to be whatever C uses in the default
9341 "C" locale. We could impose a guarantee like the one Nathan suggested
9342 (a character from the basic execution character set must map to a
9343 single external character), but this would rule out important
9344 encodings that are in common use: it would rule out JIS, for
9345 example, and it would rule out a fixed-width encoding of UCS-4.</p>
9347 <p><i>[Curaçao: fixed rationale typo at the request of Ichiro Koshida;
9348 "shift-JIS" changed to "JIS".]</i></p>
9350 <hr>
9351 <a name="306"><h3>306.&nbsp;offsetof macro and non-POD types</h3></a><p><b>Section:</b>&nbsp;18.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.support.types"> [lib.support.types]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;21 Feb 2001</p>
9352 <p>Spliced together from reflector messages c++std-lib-8294 and -8295:</p>
9354 <p>18.1, paragraph 5, reads: "The macro <tt>offsetof</tt>
9355 accepts a restricted set of <i>type</i> arguments in this
9356 International Standard. <i>type</i> shall be a POD structure or a POD
9357 union (clause 9). The result of applying the offsetof macro to a field
9358 that is a static data member or a function member is
9359 undefined."</p>
9361 <p>For the POD requirement, it doesn't say "no diagnostic
9362 required" or "undefined behavior". I read 1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/intro.html#intro.compliance"> [intro.compliance]</a>, paragraph 1, to mean that a diagnostic is required.
9363 It's not clear whether this requirement was intended. While it's
9364 possible to provide such a diagnostic, the extra complication doesn't
9365 seem to add any value.
9366 </p>
9367 <p><b>Proposed resolution:</b></p>
9368 <p>Change 18.1, paragraph 5, to "If <i>type</i> is not a POD
9369 structure or a POD union the results are undefined."</p>
9371 <p><i>[Copenhagen: straw poll was 7-4 in favor. It was generally
9372 agreed that requiring a diagnostic was inadvertent, but some LWG
9373 members thought that diagnostics should be required whenever
9374 possible.]</i></p>
9376 <hr>
9377 <a name="307"><h3>307.&nbsp;Lack of reference typedefs in container adaptors</h3></a><p><b>Section:</b>&nbsp;23.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.adaptors"> [lib.container.adaptors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;13 Mar 2001</p>
9379 <p>From reflector message c++std-lib-8330. See also lib-8317.</p>
9382 The standard is currently inconsistent in 23.2.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.priority.queue"> [lib.priority.queue]</a>
9383 paragraph 1 and 23.2.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.stack"> [lib.stack]</a> paragraph 1.
9384 23.2.3.3/1, for example, says:
9385 </p>
9387 <blockquote>
9388 -1- Any sequence supporting operations back(), push_back() and pop_back()
9389 can be used to instantiate stack. In particular, vector (lib.vector), list
9390 (lib.list) and deque (lib.deque) can be used.
9391 </blockquote>
9393 <p>But this is false: vector&lt;bool&gt; can not be used, because the
9394 container adaptors return a T&amp; rather than using the underlying
9395 container's reference type.</p>
9397 <p>This is a contradiction that can be fixed by:</p>
9399 <ol>
9400 <li>Modifying these paragraphs to say that vector&lt;bool&gt;
9401 is an exception.</li>
9402 <li>Removing the vector&lt;bool&gt; specialization.</li>
9403 <li>Changing the return types of stack and priority_queue to use
9404 reference typedef's.</li>
9405 </ol>
9408 I propose 3. This does not preclude option 2 if we choose to do it
9409 later (see issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#96">96</a>); the issues are independent. Option
9410 3 offers a small step towards support for proxied containers. This
9411 small step fixes a current contradiction, is easy for vendors to
9412 implement, is already implemented in at least one popular lib, and
9413 does not break any code.
9414 </p>
9416 <p><b>Proposed resolution:</b></p>
9417 <p>Summary: Add reference and const_reference typedefs to queue,
9418 priority_queue and stack. Change return types of "value_type&amp;" to
9419 "reference". Change return types of "const value_type&amp;" to
9420 "const_reference". Details:</p>
9422 <p>Change 23.2.3.1/1 from:</p>
9424 <pre> namespace std {
9425 template &lt;class T, class Container = deque&lt;T&gt; &gt;
9426 class queue {
9427 public:
9428 typedef typename Container::value_type value_type;
9429 typedef typename Container::size_type size_type;
9430 typedef Container container_type;
9431 protected:
9432 Container c;
9434 public:
9435 explicit queue(const Container&amp; = Container());
9437 bool empty() const { return c.empty(); }
9438 size_type size() const { return c.size(); }
9439 value_type&amp; front() { return c.front(); }
9440 const value_type&amp; front() const { return c.front(); }
9441 value_type&amp; back() { return c.back(); }
9442 const value_type&amp; back() const { return c.back(); }
9443 void push(const value_type&amp; x) { c.push_back(x); }
9444 void pop() { c.pop_front(); }
9446 </pre>
9448 <p>to:</p>
9450 <pre> namespace std {
9451 template &lt;class T, class Container = deque&lt;T&gt; &gt;
9452 class queue {
9453 public:
9454 typedef typename Container::value_type value_type;
9455 typedef typename Container::reference reference;
9456 typedef typename Container::const_reference const_reference;
9457 typedef typename Container::value_type value_type;
9458 typedef typename Container::size_type size_type;
9459 typedef Container container_type;
9460 protected:
9461 Container c;
9463 public:
9464 explicit queue(const Container&amp; = Container());
9466 bool empty() const { return c.empty(); }
9467 size_type size() const { return c.size(); }
9468 reference front() { return c.front(); }
9469 const_reference front() const { return c.front(); }
9470 reference back() { return c.back(); }
9471 const_reference back() const { return c.back(); }
9472 void push(const value_type&amp; x) { c.push_back(x); }
9473 void pop() { c.pop_front(); }
9475 </pre>
9477 <p>Change 23.2.3.2/1 from:</p>
9479 <pre> namespace std {
9480 template &lt;class T, class Container = vector&lt;T&gt;,
9481 class Compare = less&lt;typename Container::value_type&gt; &gt;
9482 class priority_queue {
9483 public:
9484 typedef typename Container::value_type value_type;
9485 typedef typename Container::size_type size_type;
9486 typedef Container container_type;
9487 protected:
9488 Container c;
9489 Compare comp;
9491 public:
9492 explicit priority_queue(const Compare&amp; x = Compare(),
9493 const Container&amp; = Container());
9494 template &lt;class InputIterator&gt;
9495 priority_queue(InputIterator first, InputIterator last,
9496 const Compare&amp; x = Compare(),
9497 const Container&amp; = Container());
9499 bool empty() const { return c.empty(); }
9500 size_type size() const { return c.size(); }
9501 const value_type&amp; top() const { return c.front(); }
9502 void push(const value_type&amp; x);
9503 void pop();
9505 // no equality is provided
9507 </pre>
9509 <p>to:</p>
9511 <pre> namespace std {
9512 template &lt;class T, class Container = vector&lt;T&gt;,
9513 class Compare = less&lt;typename Container::value_type&gt; &gt;
9514 class priority_queue {
9515 public:
9516 typedef typename Container::value_type value_type;
9517 typedef typename Container::reference reference;
9518 typedef typename Container::const_reference const_reference;
9519 typedef typename Container::size_type size_type;
9520 typedef Container container_type;
9521 protected:
9522 Container c;
9523 Compare comp;
9525 public:
9526 explicit priority_queue(const Compare&amp; x = Compare(),
9527 const Container&amp; = Container());
9528 template &lt;class InputIterator&gt;
9529 priority_queue(InputIterator first, InputIterator last,
9530 const Compare&amp; x = Compare(),
9531 const Container&amp; = Container());
9533 bool empty() const { return c.empty(); }
9534 size_type size() const { return c.size(); }
9535 const_reference top() const { return c.front(); }
9536 void push(const value_type&amp; x);
9537 void pop();
9539 // no equality is provided
9541 </pre>
9543 <p>And change 23.2.3.3/1 from:</p>
9545 <pre> namespace std {
9546 template &lt;class T, class Container = deque&lt;T&gt; &gt;
9547 class stack {
9548 public:
9549 typedef typename Container::value_type value_type;
9550 typedef typename Container::size_type size_type;
9551 typedef Container container_type;
9552 protected:
9553 Container c;
9555 public:
9556 explicit stack(const Container&amp; = Container());
9558 bool empty() const { return c.empty(); }
9559 size_type size() const { return c.size(); }
9560 value_type&amp; top() { return c.back(); }
9561 const value_type&amp; top() const { return c.back(); }
9562 void push(const value_type&amp; x) { c.push_back(x); }
9563 void pop() { c.pop_back(); }
9566 template &lt;class T, class Container&gt;
9567 bool operator==(const stack&lt;T, Container&gt;&amp; x,
9568 const stack&lt;T, Container&gt;&amp; y);
9569 template &lt;class T, class Container&gt;
9570 bool operator&lt; (const stack&lt;T, Container&gt;&amp; x,
9571 const stack&lt;T, Container&gt;&amp; y);
9572 template &lt;class T, class Container&gt;
9573 bool operator!=(const stack&lt;T, Container&gt;&amp; x,
9574 const stack&lt;T, Container&gt;&amp; y);
9575 template &lt;class T, class Container&gt;
9576 bool operator&gt; (const stack&lt;T, Container&gt;&amp; x,
9577 const stack&lt;T, Container&gt;&amp; y);
9578 template &lt;class T, class Container&gt;
9579 bool operator&gt;=(const stack&lt;T, Container&gt;&amp; x,
9580 const stack&lt;T, Container&gt;&amp; y);
9581 template &lt;class T, class Container&gt;
9582 bool operator&lt;=(const stack&lt;T, Container&gt;&amp; x,
9583 const stack&lt;T, Container&gt;&amp; y);
9585 </pre>
9587 <p>to:</p>
9589 <pre> namespace std {
9590 template &lt;class T, class Container = deque&lt;T&gt; &gt;
9591 class stack {
9592 public:
9593 typedef typename Container::value_type value_type;
9594 typedef typename Container::reference reference;
9595 typedef typename Container::const_reference const_reference;
9596 typedef typename Container::size_type size_type;
9597 typedef Container container_type;
9598 protected:
9599 Container c;
9601 public:
9602 explicit stack(const Container&amp; = Container());
9604 bool empty() const { return c.empty(); }
9605 size_type size() const { return c.size(); }
9606 reference top() { return c.back(); }
9607 const_reference top() const { return c.back(); }
9608 void push(const value_type&amp; x) { c.push_back(x); }
9609 void pop() { c.pop_back(); }
9612 template &lt;class T, class Container&gt;
9613 bool operator==(const stack&lt;T, Container&gt;&amp; x,
9614 const stack&lt;T, Container&gt;&amp; y);
9615 template &lt;class T, class Container&gt;
9616 bool operator&lt; (const stack&lt;T, Container&gt;&amp; x,
9617 const stack&lt;T, Container&gt;&amp; y);
9618 template &lt;class T, class Container&gt;
9619 bool operator!=(const stack&lt;T, Container&gt;&amp; x,
9620 const stack&lt;T, Container&gt;&amp; y);
9621 template &lt;class T, class Container&gt;
9622 bool operator&gt; (const stack&lt;T, Container&gt;&amp; x,
9623 const stack&lt;T, Container&gt;&amp; y);
9624 template &lt;class T, class Container&gt;
9625 bool operator&gt;=(const stack&lt;T, Container&gt;&amp; x,
9626 const stack&lt;T, Container&gt;&amp; y);
9627 template &lt;class T, class Container&gt;
9628 bool operator&lt;=(const stack&lt;T, Container&gt;&amp; x,
9629 const stack&lt;T, Container&gt;&amp; y);
9631 </pre>
9633 <p><i>[Copenhagen: This change was discussed before the IS was released
9634 and it was deliberately not adopted. Nevertheless, the LWG believes
9635 (straw poll: 10-2) that it is a genuine defect.]</i></p>
9637 <hr>
9638 <a name="308"><h3>308.&nbsp;Table 82 mentions unrelated headers</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;15 Mar 2001</p>
9640 Table 82 in section 27 mentions the header &lt;cstdlib&gt; for String
9641 streams (27.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.string.streams"> [lib.string.streams]</a>) and the headers &lt;cstdio&gt; and
9642 &lt;cwchar&gt; for File streams (27.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.file.streams"> [lib.file.streams]</a>). It's not clear
9643 why these headers are mentioned in this context since they do not
9644 define any of the library entities described by the
9645 subclauses. According to 17.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.contents"> [lib.contents]</a>, only such headers
9646 are to be listed in the summary.
9647 </p>
9648 <p><b>Proposed resolution:</b></p>
9649 <p>Remove &lt;cstdlib&gt; and &lt;cwchar&gt; from
9650 Table 82.</p>
9652 <p><i>[Copenhagen: changed the proposed resolution slightly. The
9653 original proposed resolution also said to remove &lt;cstdio&gt; from
9654 Table 82. However, &lt;cstdio&gt; is mentioned several times within
9655 section 27.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.file.streams"> [lib.file.streams]</a>, including 27.8.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.c.files"> [lib.c.files]</a>.]</i></p>
9657 <hr>
9658 <a name="310"><h3>310.&nbsp;Is errno a macro?</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>, 19.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-diagnostics.html#lib.errno"> [lib.errno]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;21 Mar 2001</p>
9660 Exactly how should errno be declared in a conforming C++ header?
9661 </p>
9664 The C standard says in 7.1.4 that it is unspecified whether errno is a
9665 macro or an identifier with external linkage. In some implementations
9666 it can be either, depending on compile-time options. (E.g., on
9667 Solaris in multi-threading mode, errno is a macro that expands to a
9668 function call, but is an extern int otherwise. "Unspecified" allows
9669 such variability.)
9670 </p>
9672 <p>The C++ standard:</p>
9673 <ul>
9674 <li>17.4.1.2 says in a note that errno must be macro in C. (false)</li>
9675 <li>17.4.3.1.3 footnote 166 says errno is reserved as an external
9676 name (true), and implies that it is an identifier.</li>
9677 <li>19.3 simply lists errno as a macro (by what reasoning?) and goes
9678 on to say that the contents of of C++ &lt;errno.h&gt; are the
9679 same as in C, begging the question.</li>
9680 <li>C.2, table 95 lists errno as a macro, without comment.</li>
9681 </ul>
9683 <p>I find no other references to errno.</p>
9685 <p>We should either explicitly say that errno must be a macro, even
9686 though it need not be a macro in C, or else explicitly leave it
9687 unspecified. We also need to say something about namespace std.
9688 A user who includes &lt;cerrno&gt; needs to know whether to write
9689 <tt>errno</tt>, or <tt>::errno</tt>, or <tt>std::errno</tt>, or
9690 else &lt;cerrno&gt; is useless.</p>
9692 <p>Two acceptable fixes:</p>
9693 <ul>
9694 <li><p>errno must be a macro. This is trivially satisfied by adding<br>
9695 &nbsp;&nbsp;#define errno (::std::errno)<br>
9696 to the headers if errno is not already a macro. You then always
9697 write errno without any scope qualification, and it always expands
9698 to a correct reference. Since it is always a macro, you know to
9699 avoid using errno as a local identifer.</p></li>
9700 <li><p>errno is in the global namespace. This fix is inferior, because
9701 ::errno is not guaranteed to be well-formed.</p></li>
9702 </ul>
9704 <p><i>[
9705 This issue was first raised in 1999, but it slipped through
9706 the cracks.
9707 ]</i></p>
9708 <p><b>Proposed resolution:</b></p>
9709 <p>Change the Note in section 17.4.1.2p5 from</p>
9711 <blockquote>
9712 Note: the names defined as macros in C include the following:
9713 assert, errno, offsetof, setjmp, va_arg, va_end, and va_start.
9714 </blockquote>
9716 <p>to</p>
9718 <blockquote>
9719 Note: the names defined as macros in C include the following:
9720 assert, offsetof, setjmp, va_arg, va_end, and va_start.
9721 </blockquote>
9723 <p>In section 19.3, change paragraph 2 from</p>
9725 <blockquote>
9726 The contents are the same as the Standard C library header
9727 &lt;errno.h&gt;.
9728 </blockquote>
9730 <p>to</p>
9732 <blockquote>
9733 The contents are the same as the Standard C library header
9734 &lt;errno.h&gt;, except that errno shall be defined as a macro.
9735 </blockquote>
9736 <p><b>Rationale:</b></p>
9737 <p>C++ must not leave it up to the implementation to decide whether or
9738 not a name is a macro; it must explicitly specify exactly which names
9739 are required to be macros. The only one that really works is for it
9740 to be a macro.</p>
9742 <p><i>[Curaçao: additional rationale added.]</i></p>
9744 <hr>
9745 <a name="311"><h3>311.&nbsp;Incorrect wording in basic_ostream class synopsis</h3></a><p><b>Section:</b>&nbsp;27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Sawyer&nbsp; <b>Date:</b>&nbsp;21 Mar 2001</p>
9747 <p>In 27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>, the synopsis of class basic_ostream says:</p>
9749 <pre> // partial specializationss
9750 template&lt;class traits&gt;
9751 basic_ostream&lt;char,traits&gt;&amp; operator&lt;&lt;( basic_ostream&lt;char,traits&gt;&amp;,
9752 const char * );
9753 </pre>
9755 <p>Problems:</p>
9756 <ul>
9757 <li>Too many 's's at the end of "specializationss" </li>
9758 <li>This is an overload, not a partial specialization</li>
9759 </ul>
9761 <p><b>Proposed resolution:</b></p>
9762 <p>In the synopsis in 27.6.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream"> [lib.ostream]</a>, remove the
9763 <i>// partial specializationss</i> comment. Also remove the same
9764 comment (correctly spelled, but still incorrect) from the synopsis in
9765 27.6.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.character"> [lib.ostream.inserters.character]</a>.
9766 </p>
9768 <p><i>[
9769 Pre-Redmond: added 27.6.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.character"> [lib.ostream.inserters.character]</a> because of Martin's
9770 comment in c++std-lib-8939.
9771 ]</i></p>
9773 <hr>
9774 <a name="312"><h3>312.&nbsp;Table 27 is missing headers</h3></a><p><b>Section:</b>&nbsp;20 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.utilities"> [lib.utilities]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;29 Mar 2001</p>
9775 <p>Table 27 in section 20 lists the header &lt;memory&gt; (only) for
9776 Memory (lib.memory) but neglects to mention the headers
9777 &lt;cstdlib&gt; and &lt;cstring&gt; that are discussed in 20.4.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.c.malloc"> [lib.c.malloc]</a>.</p>
9778 <p><b>Proposed resolution:</b></p>
9779 <p>Add &lt;cstdlib&gt; and &lt;cstring&gt; to Table 27, in the same row
9780 as &lt;memory&gt;.</p>
9781 <hr>
9782 <a name="315"><h3>315.&nbsp;Bad "range" in list::unique complexity</h3></a><p><b>Section:</b>&nbsp;23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Sawyer&nbsp; <b>Date:</b>&nbsp;1 May 2001</p>
9784 23.2.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.ops"> [lib.list.ops]</a>, Para 21 describes the complexity of
9785 list::unique as: "If the range (last - first) is not empty, exactly
9786 (last - first) -1 applications of the corresponding predicate,
9787 otherwise no applications of the predicate)".
9788 </p>
9791 "(last - first)" is not a range.
9792 </p>
9793 <p><b>Proposed resolution:</b></p>
9795 Change the "range" from (last - first) to [first, last).
9796 </p>
9797 <hr>
9798 <a name="316"><h3>316.&nbsp;Vague text in Table 69</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;4 May 2001</p>
9799 <p>Table 69 says this about a_uniq.insert(t):</p>
9801 <blockquote>
9802 inserts t if and only if there is no element in the container with key
9803 equivalent to the key of t. The bool component of the returned pair
9804 indicates whether the insertion takes place and the iterator component of the
9805 pair points to the element with key equivalent to the key of t.
9806 </blockquote>
9808 <p>The description should be more specific about exactly how the bool component
9809 indicates whether the insertion takes place.</p>
9810 <p><b>Proposed resolution:</b></p>
9811 <p>Change the text in question to</p>
9813 <blockquote>
9814 ...The bool component of the returned pair is true if and only if the insertion
9815 takes place...
9816 </blockquote>
9817 <hr>
9818 <a name="317"><h3>317.&nbsp;Instantiation vs. specialization of facets</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;4 May 2001</p>
9820 The localization section of the standard refers to specializations of
9821 the facet templates as instantiations even though the required facets
9822 are typically specialized rather than explicitly (or implicitly)
9823 instantiated. In the case of ctype&lt;char&gt; and
9824 ctype_byname&lt;char&gt; (and the wchar_t versions), these facets are
9825 actually required to be specialized. The terminology should be
9826 corrected to make it clear that the standard doesn't mandate explicit
9827 instantiation (the term specialization encompasses both explicit
9828 instantiations and specializations).
9829 </p>
9830 <p><b>Proposed resolution:</b></p>
9832 In the following paragraphs, replace all occurrences of the word
9833 instantiation or instantiations with specialization or specializations,
9834 respectively:
9835 </p>
9837 <blockquote>
9838 22.1.1.1.1, p4, Table 52, 22.2.1.1, p2, 22.2.1.5, p3, 22.2.1.5.1, p5,
9839 22.2.1.5.2, p10, 22.2.2, p2, 22.2.3.1, p1, 22.2.3.1.2, p1, p2 and p3,
9840 22.2.4.1, p1, 22.2.4.1.2, p1, 22,2,5, p1, 22,2,6, p2, 22.2.6.3.2, p7, and
9841 Footnote 242.
9842 </blockquote>
9844 <p>And change the text in 22.1.1.1.1, p4 from</p>
9846 <blockquote>
9847 An implementation is required to provide those instantiations
9848 for facet templates identified as members of a category, and
9849 for those shown in Table 52:
9850 </blockquote>
9852 <p>to</p>
9854 <blockquote>
9855 An implementation is required to provide those specializations...
9856 </blockquote>
9858 <p><i>[Nathan will review these changes, and will look for places where
9859 explicit specialization is necessary.]</i></p>
9861 <p><b>Rationale:</b></p>
9862 <p>This is a simple matter of outdated language. The language to
9863 describe templates was clarified during the standardization process,
9864 but the wording in clause 22 was never updated to reflect that
9865 change.</p>
9866 <hr>
9867 <a name="318"><h3>318.&nbsp;Misleading comment in definition of numpunct_byname</h3></a><p><b>Section:</b>&nbsp;22.2.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.numpunct.byname"> [lib.locale.numpunct.byname]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;12 May 2001</p>
9868 <p>The definition of the numpunct_byname template contains the following
9869 comment:</p>
9871 <pre> namespace std {
9872 template &lt;class charT&gt;
9873 class numpunct_byname : public numpunct&lt;charT&gt; {
9874 // this class is specialized for char and wchar_t.
9876 </pre>
9878 <p>There is no documentation of the specializations and it seems
9879 conceivable that an implementation will not explicitly specialize the
9880 template at all, but simply provide the primary template.</p>
9881 <p><b>Proposed resolution:</b></p>
9882 <p>Remove the comment from the text in 22.2.3.2 and from the proposed
9883 resolution of library issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#228">228</a>.</p>
9884 <hr>
9885 <a name="319"><h3>319.&nbsp;Storage allocation wording confuses "Required behavior", "Requires"</h3></a><p><b>Section:</b>&nbsp;18.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.single"> [lib.new.delete.single]</a>, 18.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.array"> [lib.new.delete.array]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;15 May 2001</p>
9886 <p>The standard specifies 17.3.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.structure.specifications"> [lib.structure.specifications]</a> that "Required
9887 behavior" elements describe "the semantics of a function definition
9888 provided by either the implementation or a C++ program."</p>
9890 <p>The standard specifies 17.3.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.structure.specifications"> [lib.structure.specifications]</a> that "Requires"
9891 elements describe "the preconditions for calling the function."</p>
9893 <p>In the sections noted below, the current wording specifies
9894 "Required Behavior" for what are actually preconditions, and thus
9895 should be specified as "Requires".</p>
9897 <p><b>Proposed resolution:</b></p>
9899 <p>In 18.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.single"> [lib.new.delete.single]</a> Para 12 Change:</p>
9900 <blockquote>
9901 <p>Required behavior: accept a value of ptr that is null or that was
9902 returned by an earlier call ...</p>
9903 </blockquote>
9904 <p>to:</p>
9905 <blockquote>
9906 <p>Requires: the value of ptr is null or the value returned by an
9907 earlier call ...</p>
9908 </blockquote>
9910 <p>In 18.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.array"> [lib.new.delete.array]</a> Para 11 Change:</p>
9911 <blockquote>
9912 <p>Required behavior: accept a value of ptr that is null or that was
9913 returned by an earlier call ...</p>
9914 </blockquote>
9915 <p>to:</p>
9916 <blockquote>
9917 <p>Requires: the value of ptr is null or the value returned by an
9918 earlier call ...</p>
9919 </blockquote>
9921 <hr>
9922 <a name="320"><h3>320.&nbsp;list::assign overspecified</h3></a><p><b>Section:</b>&nbsp;23.2.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.list.cons"> [lib.list.cons]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;17 May 2001</p>
9924 Section 23.2.2.1, paragraphs 6-8 specify that list assign (both forms) have
9925 the "effects" of a call to erase followed by a call to insert.
9926 </p>
9929 I would like to document that implementers have the freedom to implement
9930 assign by other methods, as long as the end result is the same and the
9931 exception guarantee is as good or better than the basic guarantee.
9932 </p>
9935 The motivation for this is to use T's assignment operator to recycle
9936 existing nodes in the list instead of erasing them and reallocating
9937 them with new values. It is also worth noting that, with careful
9938 coding, most common cases of assign (everything but assignment with
9939 true input iterators) can elevate the exception safety to strong if
9940 T's assignment has a nothrow guarantee (with no extra memory cost).
9941 Metrowerks does this. However I do not propose that this subtlety be
9942 standardized. It is a QoI issue. </p>
9944 <p>Existing practise:
9945 Metrowerks and SGI recycle nodes, Dinkumware and Rogue Wave don't.
9946 </p>
9947 <p><b>Proposed resolution:</b></p>
9948 <p>Change 23.2.2.1/7 from:</p>
9950 <blockquote>
9951 <p>Effects:</p>
9953 <pre> erase(begin(), end());
9954 insert(begin(), first, last);
9955 </pre>
9956 </blockquote>
9958 <p>to:</p>
9960 <blockquote>
9961 <p>Effects: Replaces the contents of the list with the range [first, last).</p>
9962 </blockquote>
9964 <p>In 23.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.sequence.reqmts"> [lib.sequence.reqmts]</a>, in Table 67 (sequence requirements),
9965 add two new rows:</p>
9966 <pre> a.assign(i,j) void pre: i,j are not iterators into a.
9967 Replaces elements in a with a copy
9968 of [i, j).
9970 a.assign(n,t) void pre: t is not a reference into a.
9971 Replaces elements in a with n copies
9972 of t.
9973 </pre>
9975 <p>Change 23.2.2.1/8 from:</p>
9977 <blockquote>
9978 <p>Effects:</p>
9979 <pre> erase(begin(), end());
9980 insert(begin(), n, t);
9981 </pre>
9982 </blockquote>
9983 <p>to:</p>
9985 <blockquote>
9986 <p>Effects: Replaces the contents of the list with n copies of t.</p>
9987 </blockquote>
9989 <p><i>[Redmond: Proposed resolution was changed slightly. Previous
9990 version made explicit statement about exception safety, which wasn't
9991 consistent with the way exception safety is expressed elsewhere.
9992 Also, the change in the sequence requirements is new. Without that
9993 change, the proposed resolution would have required that assignment of
9994 a subrange would have to work. That too would have been
9995 overspecification; it would effectively mandate that assignment use a
9996 temporary. Howard provided wording.
9997 ]</i></p>
9999 <p><i>[Curaçao: Made editorial improvement in wording; changed
10000 "Replaces elements in a with copies of elements in [i, j)."
10001 with "Replaces the elements of a with a copy of [i, j)."
10002 Changes not deemed serious enough to requre rereview.]</i></p>
10004 <hr>
10005 <a name="321"><h3>321.&nbsp;Typo in num_get</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Kevin Djang&nbsp; <b>Date:</b>&nbsp;17 May 2001</p>
10007 Section 22.2.2.1.2 at p7 states that "A length specifier is added to
10008 the conversion function, if needed, as indicated in Table 56."
10009 However, Table 56 uses the term "length modifier", not "length
10010 specifier".
10011 </p>
10012 <p><b>Proposed resolution:</b></p>
10014 In 22.2.2.1.2 at p7, change the text "A length specifier is added ..."
10015 to be "A length modifier is added ..."
10016 </p>
10017 <p><b>Rationale:</b></p>
10018 <p>C uses the term "length modifier". We should be consistent.</p>
10019 <hr>
10020 <a name="322"><h3>322.&nbsp;iterator and const_iterator should have the same value type</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;17 May 2001</p>
10022 It's widely assumed that, if X is a container,
10023 iterator_traits&lt;X::iterator&gt;::value_type and
10024 iterator_traits&lt;X::const_iterator&gt;::value_type should both be
10025 X::value_type. However, this is nowhere stated. The language in
10026 Table 65 is not precise about the iterators' value types (it predates
10027 iterator_traits), and could even be interpreted as saying that
10028 iterator_traits&lt;X::const_iterator&gt;::value_type should be "const
10029 X::value_type".
10030 </p>
10032 <p>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279">279</a>.</p>
10033 <p><b>Proposed resolution:</b></p>
10034 <p>In Table 65 ("Container Requirements"), change the return type for
10035 X::iterator to "iterator type whose value type is T". Change the
10036 return type for X::const_iterator to "constant iterator type whose
10037 value type is T".</p>
10038 <p><b>Rationale:</b></p>
10040 This belongs as a container requirement, rather than an iterator
10041 requirement, because the whole notion of iterator/const_iterator
10042 pairs is specific to containers' iterator.
10043 </p>
10045 It is existing practice that (for example)
10046 iterator_traits&lt;list&lt;int&gt;::const_iterator&gt;::value_type
10047 is "int", rather than "const int". This is consistent with
10048 the way that const pointers are handled: the standard already
10049 requires that iterator_traits&lt;const int*&gt;::value_type is int.
10050 </p>
10051 <hr>
10052 <a name="324"><h3>324.&nbsp;Do output iterators have value types?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;7 June 2001</p>
10054 <p>Table 73 suggests that output iterators have value types. It
10055 requires the expression "*a = t". Additionally, although Table 73
10056 never lists "a = t" or "X(a) = t" in the "expressions" column, it
10057 contains a note saying that "a = t" and "X(a) = t" have equivalent
10058 (but nowhere specified!) semantics.</p>
10060 <p>According to 24.1/9, t is supposed to be "a value of value type
10061 T":</p>
10063 <blockquote>
10064 In the following sections, a and b denote values of X, n denotes a
10065 value of the difference type Distance, u, tmp, and m denote
10066 identifiers, r denotes a value of X&amp;, t denotes a value of
10067 value type T.
10068 </blockquote>
10070 <p>Two other parts of the standard that are relevant to whether
10071 output iterators have value types:</p>
10073 <ul>
10074 <li>24.1/1 says "All iterators i support the expression *i,
10075 resulting in a value of some class, enumeration, or built-in type
10076 T, called the value type of the iterator".</li>
10078 <li>
10079 24.3.1/1, which says "In the case of an output iterator, the types
10080 iterator_traits&lt;Iterator&gt;::difference_type
10081 iterator_traits&lt;Iterator&gt;::value_type are both defined as void."
10082 </li>
10083 </ul>
10085 <p>The first of these passages suggests that "*i" is supposed to
10086 return a useful value, which contradicts the note in 24.1.2/2 saying
10087 that the only valid use of "*i" for output iterators is in an
10088 expression of the form "*i = t". The second of these passages appears
10089 to contradict Table 73, because it suggests that "*i"'s return value
10090 should be void. The second passage is also broken in the case of a an
10091 iterator type, like non-const pointers, that satisfies both the output
10092 iterator requirements and the forward iterator requirements.</p>
10094 <p>What should the standard say about <tt>*i</tt>'s return value when
10095 i is an output iterator, and what should it say about that t is in the
10096 expression "*i = t"? Finally, should the standard say anything about
10097 output iterators' pointer and reference types?</p>
10099 <p><b>Proposed resolution:</b></p>
10100 <p>24.1 p1, change</p>
10102 <blockquote>
10103 <p>All iterators <tt>i</tt> support the expression <tt>*i</tt>, resulting
10104 in a value of some class, enumeration, or built-in type <tt>T</tt>,
10105 called the value type of the iterator.</p>
10106 </blockquote>
10108 <p>to</p>
10110 <blockquote>
10111 <p>All input iterators <tt>i</tt> support the expression <tt>*i</tt>,
10112 resulting in a value of some class, enumeration, or built-in type
10113 <tt>T</tt>, called the value type of the iterator. All output
10114 iterators support the expression <tt>*i = o</tt> where <tt>o</tt> is a
10115 value of some type that is in the set of types that are <i>writable</i> to
10116 the particular iterator type of <tt>i</tt>.
10117 </p>
10118 </blockquote>
10120 <p>24.1 p9, add</p>
10122 <blockquote>
10123 <p><tt>o</tt> denotes a value of some type that is writable to the
10124 output iterator.
10125 </p>
10126 </blockquote>
10128 <p>Table 73, change</p>
10130 <blockquote>
10131 <pre>*a = t
10132 </pre>
10133 </blockquote>
10135 <p>to</p>
10137 <blockquote>
10138 <pre>*r = o
10139 </pre>
10140 </blockquote>
10142 <p>and change</p>
10144 <blockquote>
10145 <pre>*r++ = t
10146 </pre>
10147 </blockquote>
10149 <p>to</p>
10151 <blockquote>
10152 <pre>*r++ = o
10153 </pre>
10154 </blockquote>
10156 <p><i>[post-Redmond: Jeremy provided wording]</i></p>
10158 <p><b>Rationale:</b></p>
10159 <p>The LWG considered two options: change all of the language that
10160 seems to imply that output iterators have value types, thus making it
10161 clear that output iterators have no value types, or else define value
10162 types for output iterator consistently. The LWG chose the former
10163 option, because it seems clear that output iterators were never
10164 intended to have value types. This was a deliberate design decision,
10165 and any language suggesting otherwise is simply a mistake.</p>
10167 <p>A future revision of the standard may wish to revisit this design
10168 decision.</p>
10169 <hr>
10170 <a name="325"><h3>325.&nbsp;Misleading text in moneypunct&lt;&gt;::do_grouping</h3></a><p><b>Section:</b>&nbsp;22.2.6.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.moneypunct.virtuals"> [lib.locale.moneypunct.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;02 Jul 2001</p>
10171 <p>The Returns clause in 22.2.6.3.2, p3 says about
10172 moneypunct&lt;charT&gt;::do_grouping()
10173 </p>
10175 <blockquote>
10176 Returns: A pattern defined identically as the result of
10177 numpunct&lt;charT&gt;::do_grouping().241)
10178 </blockquote>
10180 <p>Footnote 241 then reads</p>
10182 <blockquote>
10183 This is most commonly the value "\003" (not "3").
10184 </blockquote>
10187 The returns clause seems to imply that the two member functions must
10188 return an identical value which in reality may or may not be true,
10189 since the facets are usually implemented in terms of struct std::lconv
10190 and return the value of the grouping and mon_grouping, respectively.
10191 The footnote also implies that the member function of the moneypunct
10192 facet (rather than the overridden virtual functions in moneypunct_byname)
10193 most commonly return "\003", which contradicts the C standard which
10194 specifies the value of "" for the (most common) C locale.
10195 </p>
10197 <p><b>Proposed resolution:</b></p>
10198 <p>Replace the text in Returns clause in 22.2.6.3.2, p3 with the following:</p>
10200 <blockquote>
10201 Returns: A pattern defined identically as, but not necessarily
10202 equal to, the result of numpunct&lt;charT&gt;::do_grouping().241)
10203 </blockquote>
10205 <p>and replace the text in Footnote 241 with the following:</p>
10207 <blockquote>
10208 To specify grouping by 3s the value is "\003", not "3".
10209 </blockquote>
10210 <p><b>Rationale:</b></p>
10212 The fundamental problem is that the description of the locale facet
10213 virtuals serves two purposes: describing the behavior of the base
10214 class, and describing the meaning of and constraints on the behavior
10215 in arbitrary derived classes. The new wording makes that separation a
10216 little bit clearer. The footnote (which is nonnormative) is not
10217 supposed to say what the grouping is in the "C" locale or in any other
10218 locale. It is just a reminder that the values are interpreted as small
10219 integers, not ASCII characters.
10220 </p>
10221 <hr>
10222 <a name="327"><h3>327.&nbsp;Typo in time_get facet in table 52</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Tiki Wan&nbsp; <b>Date:</b>&nbsp;06 Jul 2001</p>
10223 <p>The <tt>wchar_t</tt> versions of <tt>time_get</tt> and
10224 <tt>time_get_byname</tt> are listed incorrectly in table 52,
10225 required instantiations. In both cases the second template
10226 parameter is given as OutputIterator. It should instead be
10227 InputIterator, since these are input facets.</p>
10228 <p><b>Proposed resolution:</b></p>
10230 In table 52, required instantiations, in
10231 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>, change</p>
10232 <pre> time_get&lt;wchar_t, OutputIterator&gt;
10233 time_get_byname&lt;wchar_t, OutputIterator&gt;
10234 </pre>
10235 <p>to</p>
10236 <pre> time_get&lt;wchar_t, InputIterator&gt;
10237 time_get_byname&lt;wchar_t, InputIterator&gt;
10238 </pre>
10240 <p><i>[Redmond: Very minor change in proposed resolution. Original had
10241 a typo, wchart instead of wchar_t.]</i></p>
10243 <hr>
10244 <a name="328"><h3>328.&nbsp;Bad sprintf format modifier in money_put&lt;&gt;::do_put()</h3></a><p><b>Section:</b>&nbsp;22.2.6.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.money.put.virtuals"> [lib.locale.money.put.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;07 Jul 2001</p>
10245 <p>The sprintf format string , "%.01f" (that's the digit one), in the
10246 description of the do_put() member functions of the money_put facet in
10247 22.2.6.2.2, p1 is incorrect. First, the f format specifier is wrong
10248 for values of type long double, and second, the precision of 01
10249 doesn't seem to make sense. What was most likely intended was
10250 "%.0Lf"., that is a precision of zero followed by the L length
10251 modifier.</p>
10252 <p><b>Proposed resolution:</b></p>
10253 <p>Change the format string to "%.0Lf".</p>
10254 <p><b>Rationale:</b></p>
10255 <p>Fixes an obvious typo</p>
10256 <hr>
10257 <a name="329"><h3>329.&nbsp;vector capacity, reserve and reallocation</h3></a><p><b>Section:</b>&nbsp;23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a>, 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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Anthony Williams&nbsp; <b>Date:</b>&nbsp;13 Jul 2001</p>
10259 There is an apparent contradiction about which circumstances can cause
10260 a reallocation of a vector in Section 23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a> and
10261 section 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>.
10262 </p>
10264 <p>23.2.4.2p5 says:</p>
10265 <blockquote>
10266 Notes: Reallocation invalidates all the references, pointers, and iterators
10267 referring to the elements in the sequence. It is guaranteed that no
10268 reallocation takes place during insertions that happen after a call to
10269 reserve() until the time when an insertion would make the size of the vector
10270 greater than the size specified in the most recent call to reserve().
10271 </blockquote>
10273 <p>Which implies if I do</p>
10275 <pre> std::vector&lt;int&gt; vec;
10276 vec.reserve(23);
10277 vec.reserve(0);
10278 vec.insert(vec.end(),1);
10279 </pre>
10281 <p>then the implementation may reallocate the vector for the insert,
10282 as the size specified in the previous call to reserve was zero.</p>
10284 <p>However, the previous paragraphs (23.2.4.2, p1-2) state:</p>
10285 <blockquote>
10287 (capacity) Returns: The total number of elements the vector
10288 can hold without requiring reallocation
10289 </p>
10291 ...After reserve(), capacity() is greater or equal to the
10292 argument of reserve if reallocation happens; and equal to the previous value
10293 of capacity() otherwise...
10294 </p>
10295 </blockquote>
10298 This implies that vec.capacity() is still 23, and so the insert()
10299 should not require a reallocation, as vec.size() is 0. This is backed
10300 up by 23.2.4.3p1:
10301 </p>
10302 <blockquote>
10303 (insert) Notes: Causes reallocation if the new size is greater than the old
10304 capacity.
10305 </blockquote>
10308 Though this doesn't rule out reallocation if the new size is less
10309 than the old capacity, I think the intent is clear.
10310 </p>
10312 <p><b>Proposed resolution:</b></p>
10313 <p>Change the wording of 23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a> paragraph 5 to:</p>
10315 <blockquote>
10316 Notes: Reallocation invalidates all the references, pointers, and
10317 iterators referring to the elements in the sequence. It is guaranteed
10318 that no reallocation takes place during insertions that happen after a
10319 call to reserve() until the time when an insertion would make the size
10320 of the vector greater than the value of capacity().
10321 </blockquote>
10323 <p><i>[Redmond: original proposed resolution was modified slightly. In
10324 the original, the guarantee was that there would be no reallocation
10325 until the size would be greater than the value of capacity() after the
10326 most recent call to reserve(). The LWG did not believe that the
10327 "after the most recent call to reserve()" added any useful
10328 information.]</i></p>
10330 <p><b>Rationale:</b></p>
10331 <p>There was general agreement that, when reserve() is called twice in
10332 succession and the argument to the second invocation is smaller than
10333 the argument to the first, the intent was for the second invocation to
10334 have no effect. Wording implying that such cases have an effect on
10335 reallocation guarantees was inadvertant.</p>
10336 <hr>
10337 <a name="331"><h3>331.&nbsp;bad declaration of destructor for ios_base::failure</h3></a><p><b>Section:</b>&nbsp;27.4.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios::failure"> [lib.ios::failure]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;PremAnand M. Rao&nbsp; <b>Date:</b>&nbsp;23 Aug 2001</p>
10339 With the change in 17.4.4.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.res.on.exception.handling"> [lib.res.on.exception.handling]</a> to state
10340 "An implementation may strengthen the exception-specification for a
10341 non-virtual function by removing listed exceptions."
10342 (issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#119">119</a>)
10343 and the following declaration of ~failure() in ios_base::failure
10344 </p>
10345 <pre> namespace std {
10346 class ios_base::failure : public exception {
10347 public:
10349 virtual ~failure();
10353 </pre>
10354 <p>the class failure cannot be implemented since in 18.6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.exception"> [lib.exception]</a> the destructor of class exception has an empty
10355 exception specification:</p>
10356 <pre> namespace std {
10357 class exception {
10358 public:
10360 virtual ~exception() throw();
10364 </pre>
10365 <p><b>Proposed resolution:</b></p>
10366 <p>Remove the declaration of ~failure().</p>
10367 <p><b>Rationale:</b></p>
10368 <p>The proposed resolution is consistent with the way that destructors
10369 of other classes derived from <tt>exception</tt> are handled.</p>
10370 <hr>
10371 <a name="333"><h3>333.&nbsp;does endl imply synchronization with the device?</h3></a><p><b>Section:</b>&nbsp;27.6.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.manip"> [lib.ostream.manip]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;PremAnand M. Rao&nbsp; <b>Date:</b>&nbsp;27 Aug 2001</p>
10372 <p>A footnote in 27.6.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.manip"> [lib.ostream.manip]</a> states:</p>
10373 <blockquote>
10374 [Footnote: The effect of executing cout &lt;&lt; endl is to insert a
10375 newline character in the output sequence controlled by cout, then
10376 synchronize it with any external file with which it might be
10377 associated. --- end foonote]
10378 </blockquote>
10381 Does the term "file" here refer to the external device?
10382 This leads to some implementation ambiguity on systems with fully
10383 buffered files where a newline does not cause a flush to the device.
10384 </p>
10387 Choosing to sync with the device leads to significant performance
10388 penalties for each call to endl, while not sync-ing leads to
10389 errors under special circumstances.
10390 </p>
10393 I could not find any other statement that explicitly defined
10394 the behavior one way or the other.
10395 </p>
10396 <p><b>Proposed resolution:</b></p>
10397 <p>Remove footnote 300 from section 27.6.2.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.manip"> [lib.ostream.manip]</a>.</p>
10398 <p><b>Rationale:</b></p>
10399 <p>We already have normative text saying what <tt>endl</tt> does: it
10400 inserts a newline character and calls <tt>flush</tt>. This footnote
10401 is at best redundant, at worst (as this issue says) misleading,
10402 because it appears to make promises about what <tt>flush</tt>
10403 does.</p>
10404 <hr>
10405 <a name="334"><h3>334.&nbsp;map::operator[] specification forces inefficient implementation</h3></a><p><b>Section:</b>&nbsp;23.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map.access"> [lib.map.access]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andrea Griffini&nbsp; <b>Date:</b>&nbsp;02 Sep 2001</p>
10407 The current standard describes map::operator[] using a
10408 code example. That code example is however quite
10409 inefficient because it requires several useless copies
10410 of both the passed key_type value and of default
10411 constructed mapped_type instances.
10412 My opinion is that was not meant by the comitee to
10413 require all those temporary copies.
10414 </p>
10416 <p>Currently map::operator[] behaviour is specified as: </p>
10417 <pre> Returns:
10418 (*((insert(make_pair(x, T()))).first)).second.
10419 </pre>
10422 This specification however uses make_pair that is a
10423 template function of which parameters in this case
10424 will be deduced being of type const key_type&amp; and
10425 const T&amp;. This will create a pair&lt;key_type,T&gt; that
10426 isn't the correct type expected by map::insert so
10427 another copy will be required using the template
10428 conversion constructor available in pair to build
10429 the required pair&lt;const key_type,T&gt; instance.
10430 </p>
10432 <p>If we consider calling of key_type copy constructor
10433 and mapped_type default constructor and copy
10434 constructor as observable behaviour (as I think we
10435 should) then the standard is in this place requiring
10436 two copies of a key_type element plus a default
10437 construction and two copy construction of a mapped_type
10438 (supposing the addressed element is already present
10439 in the map; otherwise at least another copy
10440 construction for each type).
10441 </p>
10443 <p>A simple (half) solution would be replacing the description with:</p>
10444 <pre> Returns:
10445 (*((insert(value_type(x, T()))).first)).second.
10446 </pre>
10448 <p>This will remove the wrong typed pair construction that
10449 requires one extra copy of both key and value.</p>
10451 <p>However still the using of map::insert requires temporary
10452 objects while the operation, from a logical point of view,
10453 doesn't require any. </p>
10455 <p>I think that a better solution would be leaving free an
10456 implementer to use a different approach than map::insert
10457 that, because of its interface, forces default constructed
10458 temporaries and copies in this case.
10459 The best solution in my opinion would be just requiring
10460 map::operator[] to return a reference to the mapped_type
10461 part of the contained element creating a default element
10462 with the specified key if no such an element is already
10463 present in the container. Also a logarithmic complexity
10464 requirement should be specified for the operation.
10465 </p>
10468 This would allow library implementers to write alternative
10469 implementations not using map::insert and reaching optimal
10470 performance in both cases of the addressed element being
10471 present or absent from the map (no temporaries at all and
10472 just the creation of a new pair inside the container if
10473 the element isn't present).
10474 Some implementer has already taken this option but I think
10475 that the current wording of the standard rules that as
10476 non-conforming.
10477 </p>
10479 <p><b>Proposed resolution:</b></p>
10482 Replace 23.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map.access"> [lib.map.access]</a> paragraph 1 with
10483 </p>
10484 <blockquote>
10486 -1- Effects: If there is no key equivalent to x in the map, inserts
10487 value_type(x, T()) into the map.
10488 </p>
10490 -2- Returns: A reference to the mapped_type corresponding to x in *this.
10491 </p>
10493 -3- Complexity: logarithmic.
10494 </p>
10495 </blockquote>
10497 <p><i>[This is the second option mentioned above. Howard provided
10498 wording. We may also wish to have a blanket statement somewhere in
10499 clause 17 saying that we do not intend the semantics of sample code
10500 fragments to be interpreted as specifing exactly how many copies are
10501 made. See issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#98">98</a> for a similar problem.]</i></p>
10503 <p><b>Rationale:</b></p>
10505 This is the second solution described above; as noted, it is
10506 consistent with existing practice.
10507 </p>
10509 <p>Note that we now need to specify the complexity explicitly, because
10510 we are no longer defining <tt>operator[]</tt> in terms of
10511 <tt>insert</tt>.</p>
10512 <hr>
10513 <a name="335"><h3>335.&nbsp;minor issue with char_traits, table 37</h3></a><p><b>Section:</b>&nbsp;21.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.require"> [lib.char.traits.require]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Sawyer&nbsp; <b>Date:</b>&nbsp;06 Sep 2001</p>
10515 Table 37, in 21.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.require"> [lib.char.traits.require]</a>, descibes char_traits::assign
10517 </p>
10518 <pre> X::assign(c,d) assigns c = d.
10519 </pre>
10521 <p>And para 1 says:</p>
10523 <blockquote>
10524 [...] c and d denote values of type CharT [...]
10525 </blockquote>
10528 Naturally, if c and d are <i>values</i>, then the assignment is
10529 (effectively) meaningless. It's clearly intended that (in the case of
10530 assign, at least), 'c' is intended to be a reference type.
10531 </p>
10533 <p>I did a quick survey of the four implementations I happened to have
10534 lying around, and sure enough they all have signatures:</p>
10535 <pre> assign( charT&amp;, const charT&amp; );
10536 </pre>
10538 <p>(or the equivalent). It's also described this way in Nico's book.
10539 (Not to mention the synopses of char_traits&lt;char&gt; in 21.1.3.1
10540 and char_traits&lt;wchar_t&gt; in 21.1.3.2...)
10541 </p>
10542 <p><b>Proposed resolution:</b></p>
10543 <p>Add the following to 21.1.1 para 1:</p>
10544 <blockquote>
10545 r denotes an lvalue of CharT
10546 </blockquote>
10548 <p>and change the description of assign in the table to:</p>
10549 <pre> X::assign(r,d) assigns r = d
10550 </pre>
10551 <hr>
10552 <a name="336"><h3>336.&nbsp;Clause 17 lack of references to deprecated headers</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Detlef Vollmann&nbsp; <b>Date:</b>&nbsp;05 Sep 2001</p>
10553 <p>From c++std-edit-873:</p>
10555 <p>17.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.headers"> [lib.headers]</a>, Table 11. In this table, the header
10556 &lt;strstream&gt; is missing.</p>
10558 <p>This shows a general problem: The whole clause 17 refers quite
10559 often to clauses 18 through 27, but D.7 is also a part of the standard
10560 library (though a deprecated one).</p>
10562 <p><b>Proposed resolution:</b></p>
10564 <p>To 17.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.headers"> [lib.headers]</a> Table 11, C++ Library Headers, add
10565 "&lt;strstream&gt;".</p>
10567 <p>In the following places, change "clauses 17 through 27" to "clauses
10568 17 through 27 and Annex D":</p>
10570 <ul>
10571 <li>1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/intro.html#intro.refs"> [intro.refs]</a> Normative references/1/footnote 1</li>
10572 <li>1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/intro.html#intro.defs"> [intro.defs]</a> Definitions/1</li>
10573 <li>7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/dcl.html#dcl.dcl"> [dcl.dcl]</a> Library introduction/9</li>
10574 <li>17.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.description"> [lib.description]</a> Method of description (Informative)/1</li>
10575 <li>17.3.2.1.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.character.seq"> [lib.character.seq]</a> Character sequences/1/bullet 2</li>
10576 <li>17.3.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.functions.within.classes"> [lib.functions.within.classes]</a> Functions within classes/1</li>
10577 <li>17.3.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.objects.within.classes"> [lib.objects.within.classes]</a> Private members/1/(2 places)</li>
10578 <li>17.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.requirements"> [lib.requirements]</a> Library-wide requirements/1</li>
10579 <li>17.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.headers"> [lib.headers]</a> Headers/4</li>
10580 <li>17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a> Replacement functions/1</li>
10581 <li>17.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.global.functions"> [lib.global.functions]</a> Global or non-member functions/2</li>
10582 <li>17.4.4.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.protection.within.classes"> [lib.protection.within.classes]</a> Protection within classes/1</li>
10583 </ul>
10586 <hr>
10587 <a name="337"><h3>337.&nbsp;replace_copy_if's template parameter should be InputIterator</h3></a><p><b>Section:</b>&nbsp;25.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.replace"> [lib.alg.replace]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Detlef Vollmann&nbsp; <b>Date:</b>&nbsp;07 Sep 2001</p>
10588 <p>From c++std-edit-876:</p>
10591 In section 25.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.replace"> [lib.alg.replace]</a> before p4: The name of the first
10592 parameter of template replace_copy_if should be "InputIterator"
10593 instead of "Iterator". According to 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> p1 the
10594 parameter name conveys real normative meaning.
10595 </p>
10596 <p><b>Proposed resolution:</b></p>
10597 <p>Change <tt>Iterator</tt> to <tt>InputIterator</tt>.</p>
10598 <hr>
10599 <a name="338"><h3>338.&nbsp; is whitespace allowed between `-' and a digit?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;17 Sep 2001</p>
10601 &gt;From Stage 2 processing in 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>, p8 and 9 (the
10602 original text or the text corrected by the proposed resolution of
10603 issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#221">221</a>) it seems clear that no whitespace is allowed
10604 within a number, but 22.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.numpunct"> [lib.locale.numpunct]</a>, p2, which gives the
10605 format for integer and floating point values, says that whitespace is
10606 optional between a plusminus and a sign.
10607 </p>
10610 The text needs to be clarified to either consistently allow or
10611 disallow whitespace between a plusminus and a sign. It might be
10612 worthwhile to consider the fact that the C library stdio facility does
10613 not permit whitespace embedded in numbers and neither does the C or
10614 C++ core language (the syntax of integer-literals is given in 2.13.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lex.html#lex.icon"> [lex.icon]</a>, that of floating-point-literals in 2.13.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lex.html#lex.fcon"> [lex.fcon]</a> of the C++ standard).
10615 </p>
10616 <p><b>Proposed resolution:</b></p>
10617 <p>Change the first part of 22.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.numpunct"> [lib.locale.numpunct]</a> paragraph 2 from:</p>
10618 <blockquote>
10620 The syntax for number formats is as follows, where <tt>digit</tt>
10621 represents the radix set specified by the <tt>fmtflags</tt> argument
10622 value, <tt>whitespace</tt> is as determined by the facet
10623 <tt>ctype&lt;charT&gt;</tt> (22.2.1.1), and <tt>thousands-sep</tt> and
10624 <tt>decimal-point</tt> are the results of corresponding
10625 <tt>numpunct&lt;charT&gt;</tt> members. Integer values have the
10626 format:
10627 </p>
10628 <pre> integer ::= [sign] units
10629 sign ::= plusminus [whitespace]
10630 plusminus ::= '+' | '-'
10631 units ::= digits [thousands-sep units]
10632 digits ::= digit [digits]
10633 </pre>
10634 </blockquote>
10635 <p>to:</p>
10636 <blockquote>
10638 The syntax for number formats is as follows, where <tt>digit</tt>
10639 represents the radix set specified by the <tt>fmtflags</tt> argument
10640 value, and <tt>thousands-sep</tt> and <tt>decimal-point</tt> are the
10641 results of corresponding <tt>numpunct&lt;charT&gt;</tt> members.
10642 Integer values have the format:
10643 </p>
10644 <pre> integer ::= [sign] units
10645 sign ::= plusminus
10646 plusminus ::= '+' | '-'
10647 units ::= digits [thousands-sep units]
10648 digits ::= digit [digits]
10649 </pre>
10650 </blockquote>
10651 <p><b>Rationale:</b></p>
10652 <p>It's not clear whether the format described in 22.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.numpunct"> [lib.locale.numpunct]</a> paragraph 2 has any normative weight: nothing in the
10653 standard says how, or whether, it's used. However, there's no reason
10654 for it to differ gratuitously from the very specific description of
10655 numeric processing in 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>. The proposed
10656 resolution removes all mention of "whitespace" from that format.</p>
10657 <hr>
10658 <a name="339"><h3>339.&nbsp;definition of bitmask type restricted to clause 27</h3></a><p><b>Section:</b>&nbsp;22.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.category.ctype"> [lib.category.ctype]</a>, 17.3.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.bitmask.types"> [lib.bitmask.types]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;17 September 2001</p>
10660 The ctype_category::mask type is declared to be an enum in 22.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.category.ctype"> [lib.category.ctype]</a> with p1 then stating that it is a bitmask type, most
10661 likely referring to the definition of bitmask type in 17.3.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.bitmask.types"> [lib.bitmask.types]</a>, p1. However, the said definition only applies to
10662 clause 27, making the reference in 22.2.1 somewhat dubious.
10663 </p>
10664 <p><b>Proposed resolution:</b></p>
10665 <p>Clarify 17.3.2.1.2, p1 by changing the current text from</p>
10666 <blockquote>
10667 Several types defined in clause 27 are bitmask types. Each bitmask type
10668 can be implemented as an enumerated type that overloads certain operators,
10669 as an integer type, or as a bitset (23.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.template.bitset"> [lib.template.bitset]</a>).
10670 </blockquote>
10671 <p>to read</p>
10672 <blockquote>
10673 Several types defined in clauses lib.language.support through
10674 lib.input.output and Annex D are bitmask types. Each bitmask type can
10675 be implemented as an enumerated type that overloads certain operators,
10676 as an integer type, or as a bitset (lib.template.bitset).
10677 </blockquote>
10680 Additionally, change the definition in 22.2.1 to adopt the same
10681 convention as in clause 27 by replacing the existing text with the
10682 following (note, in particluar, the cross-reference to 17.3.2.1.2 in
10683 22.2.1, p1):
10684 </p>
10686 <blockquote>
10687 <p>22.2.1 The ctype category [lib.category.ctype]</p>
10688 <pre>namespace std {
10689 class ctype_base {
10690 public:
10691 typedef <b><i>T</i></b> mask;
10693 // numeric values are for exposition only.
10694 static const mask space = 1 &lt;&lt; 0;
10695 static const mask print = 1 &lt;&lt; 1;
10696 static const mask cntrl = 1 &lt;&lt; 2;
10697 static const mask upper = 1 &lt;&lt; 3;
10698 static const mask lower = 1 &lt;&lt; 4;
10699 static const mask alpha = 1 &lt;&lt; 5;
10700 static const mask digit = 1 &lt;&lt; 6;
10701 static const mask punct = 1 &lt;&lt; 7;
10702 static const mask xdigit = 1 &lt;&lt; 8;
10703 static const mask alnum = alpha | digit;
10704 static const mask graph = alnum | punct;
10707 </pre>
10709 <p>The type <tt>mask</tt> is a bitmask type (17.3.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.bitmask.types"> [lib.bitmask.types]</a>).</p>
10710 </blockquote>
10712 <p><i>[Curaçao: The LWG notes that T above should be bold-italics to be
10713 consistent with the rest of the standard.]</i></p>
10715 <hr>
10716 <a name="340"><h3>340.&nbsp;interpretation of <tt>has_facet&lt;Facet&gt;(loc)</tt>
10717 </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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2001</p>
10719 It's unclear whether 22.1.1.1.1, p3 says that
10720 <tt>has_facet&lt;Facet&gt;(loc)</tt> returns true for any <tt>Facet</tt>
10721 from Table 51 or whether it includes Table 52 as well:
10722 </p>
10724 <blockquote>
10725 For any locale <tt>loc</tt> either constructed, or returned by
10726 locale::classic(), and any facet <tt>Facet</tt> that is a member of a
10727 standard category, <tt>has_facet&lt;Facet&gt;(loc)</tt> is true. Each
10728 locale member function which takes a <tt>locale::category</tt>
10729 argument operates on the corresponding set of facets.
10730 </blockquote>
10733 It seems that it comes down to which facets are considered to be members of a
10734 standard category. Intuitively, I would classify all the facets in Table 52 as
10735 members of their respective standard categories, but there are an unbounded set
10736 of them...
10737 </p>
10740 The paragraph implies that, for instance, <tt>has_facet&lt;num_put&lt;C,
10741 OutputIterator&gt; &gt;(loc)</tt> must always return true. I don't think that's
10742 possible. If it were, then <tt>use_facet&lt;num_put&lt;C, OutputIterator&gt;
10743 &gt;(loc)</tt> would have to return a reference to a distinct object for each
10744 valid specialization of <tt>num_put&lt;C, OutputIteratory&gt;</tt>, which is
10745 clearly impossible.
10746 </p>
10749 On the other hand, if none of the facets in Table 52 is a member of a standard
10750 category then none of the locale member functions that operate on entire
10751 categories of facets will work properly.
10752 </p>
10755 It seems that what p3 should mention that it's required (permitted?)
10756 to hold only for specializations of <tt>Facet</tt> from Table 52 on
10757 <tt>C</tt> from the set { <tt>char</tt>, <tt>wchar_t</tt> }, and
10758 <tt>InputIterator</tt> and <tt>OutputIterator</tt> from the set of
10760 {i,o}<tt>streambuf_iterator</tt>&lt;{<tt>char</tt>,<tt>wchar_t</tt>}<tt>&gt;</tt>
10762 </p>
10763 <p><b>Proposed resolution:</b></p>
10764 <p>In 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>, paragraph 3, change
10765 "that is a member of a standard category" to "shown in Table 51".</p>
10766 <p><b>Rationale:</b></p>
10767 <p>The facets in Table 52 are an unbounded set. Locales should not be
10768 required to contain an infinite number of facets.</p>
10770 <p>It's not necessary to talk about which values of InputIterator and
10771 OutputIterator must be supported. Table 51 already contains a
10772 complete list of the ones we need.</p>
10773 <hr>
10774 <a name="341"><h3>341.&nbsp;Vector reallocation and swap</h3></a><p><b>Section:</b>&nbsp;23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Anthony Williams&nbsp; <b>Date:</b>&nbsp;27 Sep 2001</p>
10775 <p>It is a common idiom to reduce the capacity of a vector by swapping it with
10776 an empty one:</p>
10777 <pre> std::vector&lt;SomeType&gt; vec;
10778 // fill vec with data
10779 std::vector&lt;SomeType&gt;().swap(vec);
10780 // vec is now empty, with minimal capacity
10781 </pre>
10783 <p>However, the wording of 23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a>paragraph 5 prevents
10784 the capacity of a vector being reduced, following a call to
10785 reserve(). This invalidates the idiom, as swap() is thus prevented
10786 from reducing the capacity. The proposed wording for issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#329">329</a> does not affect this. Consequently, the example above
10787 requires the temporary to be expanded to cater for the contents of
10788 vec, and the contents be copied across. This is a linear-time
10789 operation.</p>
10791 <p>However, the container requirements state that swap must have constant
10792 complexity (23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> note to table 65).</p>
10794 <p>This is an important issue, as reallocation affects the validity of
10795 references and iterators.</p>
10797 <p>If the wording of 23.2.4.2p5 is taken to be the desired intent, then
10798 references and iterators remain valid after a call to swap, if they refer to
10799 an element before the new end() of the vector into which they originally
10800 pointed, in which case they refer to the element at the same index position.
10801 Iterators and references that referred to an element whose index position
10802 was beyond the new end of the vector are invalidated.</p>
10804 <p>If the note to table 65 is taken as the desired intent, then there are two
10805 possibilities with regard to iterators and references:</p>
10807 <ol>
10808 <li>All Iterators and references into both vectors are invalidated.</li>
10809 <li>Iterators and references into either vector remain valid, and remain
10810 pointing to the same element. Consequently iterators and references that
10811 referred to one vector now refer to the other, and vice-versa.</li>
10812 </ol>
10813 <p><b>Proposed resolution:</b></p>
10814 <p>Add a new paragraph after 23.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.capacity"> [lib.vector.capacity]</a> paragraph 5:</p>
10815 <blockquote>
10816 <pre> void swap(vector&lt;T,Allocator&gt;&amp; x);
10817 </pre>
10818 <p><b>Effects:</b> Exchanges the contents and capacity() of <tt>*this</tt>
10819 with that of <tt>x</tt>.</p>
10820 <p><b>Complexity:</b> Constant time.</p>
10821 </blockquote>
10823 <p><i>[This solves the problem reported for this issue. We may also
10824 have a problem with a circular definition of swap() for other
10825 containers.]</i></p>
10827 <p><b>Rationale:</b></p>
10829 swap should be constant time. The clear intent is that it should just
10830 do pointer twiddling, and that it should exchange all properties of
10831 the two vectors, including their reallocation guarantees.
10832 </p>
10833 <hr>
10834 <a name="345"><h3>345.&nbsp;type tm in &lt;cwchar&gt;</h3></a><p><b>Section:</b>&nbsp;21.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.c.strings"> [lib.c.strings]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Clark Nelson&nbsp; <b>Date:</b>&nbsp;19 Oct 2001</p>
10836 C99, and presumably amendment 1 to C90, specify that &lt;wchar.h&gt;
10837 declares struct tm as an incomplete type. However, table 48 in 21.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.c.strings"> [lib.c.strings]</a> does not mention the type tm as being declared in
10838 &lt;cwchar&gt;. Is this omission intentional or accidental?
10839 </p>
10840 <p><b>Proposed resolution:</b></p>
10841 <p>In section 21.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.c.strings"> [lib.c.strings]</a>, add "tm" to table 48.</p>
10842 <hr>
10843 <a name="346"><h3>346.&nbsp;Some iterator member functions should be const</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Jeremy Siek&nbsp; <b>Date:</b>&nbsp;20 Oct 2001</p>
10844 <p>Iterator member functions and operators that do not change the state
10845 of the iterator should be defined as const member functions or as
10846 functions that take iterators either by const reference or by
10847 value. The standard does not explicitly state which functions should
10848 be const. Since this a fairly common mistake, the following changes
10849 are suggested to make this explicit.</p>
10851 <p>The tables almost indicate constness properly through naming: r
10852 for non-const and a,b for const iterators. The following changes
10853 make this more explicit and also fix a couple problems.</p>
10854 <p><b>Proposed resolution:</b></p>
10855 <p>In 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a> Change the first section of p9 from
10856 "In the following sections, a and b denote values of X..." to
10857 "In the following sections, a and b denote values of type const X...".</p>
10859 <p>In Table 73, change</p>
10860 <pre> a-&gt;m U&amp; ...
10861 </pre>
10863 <p>to</p>
10865 <pre> a-&gt;m const U&amp; ...
10866 r-&gt;m U&amp; ...
10867 </pre>
10869 <p>In Table 73 expression column, change</p>
10871 <pre> *a = t
10872 </pre>
10874 <p>to</p>
10876 <pre> *r = t
10877 </pre>
10879 <p><i>[Redmond: The container requirements should be reviewed to see if
10880 the same problem appears there.]</i></p>
10882 <hr>
10883 <a name="347"><h3>347.&nbsp;locale::category and bitmask requirements</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;P.J. Plauger, Nathan Myers&nbsp; <b>Date:</b>&nbsp;23 Oct 2001</p>
10885 In 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> paragraph 1, the category members
10886 are described as bitmask elements. In fact, the bitmask requirements
10887 in 17.3.2.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.bitmask.types"> [lib.bitmask.types]</a> don't seem quite right: <tt>none</tt>
10888 and <tt>all</tt> are bitmask constants, not bitmask elements.</p>
10890 <p>In particular, the requirements for <tt>none</tt> interact poorly
10891 with the requirement that the LC_* constants from the C library must
10892 be recognizable as C++ locale category constants. LC_* values should
10893 not be mixed with these values to make category values.</p>
10895 <p>We have two options for the proposed resolution. Informally:
10896 option 1 removes the requirement that LC_* values be recognized as
10897 category arguments. Option 2 changes the category type so that this
10898 requirement is implementable, by allowing <tt>none</tt> to be some
10899 value such as 0x1000 instead of 0.</p>
10901 <p>Nathan writes: "I believe my proposed resolution [Option 2] merely
10902 re-expresses the status quo more clearly, without introducing any
10903 changes beyond resolving the DR.</p>
10905 <p><b>Proposed resolution:</b></p>
10906 <p>Replace the first two paragraphs of 22.1.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.types"> [lib.locale.types]</a> with:</p>
10907 <blockquote>
10908 <pre> typedef int category;
10909 </pre>
10911 <p>Valid category values include the <tt>locale</tt> member bitmask
10912 elements <tt>collate</tt>, <tt>ctype</tt>, <tt>monetary</tt>,
10913 <tt>numeric</tt>, <tt>time</tt>, and <tt>messages</tt>, each of which
10914 represents a single locale category. In addition, <tt>locale</tt> member
10915 bitmask constant <tt>none</tt> is defined as zero and represents no
10916 category. And locale member bitmask constant <tt>all</tt> is defined such that
10917 the expression</p>
10918 <pre> (collate | ctype | monetary | numeric | time | messages | all) == all
10919 </pre>
10921 is <tt>true</tt>, and represents the union of all categories. Further
10922 the expression <tt>(X | Y)</tt>, where <tt>X</tt> and <tt>Y</tt> each
10923 represent a single category, represents the union of the two
10924 categories.
10925 </p>
10928 <tt>locale</tt> member functions expecting a <tt>category</tt>
10929 argument require one of the <tt>category</tt> values defined above, or
10930 the union of two or more such values. Such a <tt>category</tt>
10931 argument identifies a set of locale categories. Each locale category,
10932 in turn, identifies a set of locale facets, including at least those
10933 shown in Table 51:
10934 </p>
10935 </blockquote>
10936 <p><i>[Curaçao: need input from locale experts.]</i></p>
10938 <p><b>Rationale:</b></p>
10940 <p>The LWG considered, and rejected, an alternate proposal (described
10941 as "Option 2" in the discussion). The main reason for rejecting it
10942 was that library implementors were concerened about implementation
10943 difficult, given that getting a C++ library to work smoothly with a
10944 separately written C library is already a delicate business. Some
10945 library implementers were also concerned about the issue of adding
10946 extra locale categories.</p>
10948 <blockquote>
10949 <p><b>Option 2:</b> <br>
10950 Replace the first paragraph of 22.1.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.types"> [lib.locale.types]</a> with:</p>
10951 <blockquote>
10953 Valid category values include the enumerated values. In addition, the
10954 result of applying commutative operators | and &amp; to any two valid
10955 values is valid, and results in the setwise union and intersection,
10956 respectively, of the argument categories. The values <tt>all</tt> and
10957 <tt>none</tt> are defined such that for any valid value <tt>cat</tt>, the
10958 expressions <tt>(cat | all == all)</tt>, <tt>(cat &amp; all == cat)</tt>,
10959 <tt>(cat | none == cat)</tt> and <tt>(cat &amp; none == none)</tt> are
10960 true. For non-equal values <tt>cat1</tt> and <tt>cat2</tt> of the
10961 remaining enumerated values, <tt>(cat1 &amp; cat2 == none)</tt> is true.
10962 For any valid categories <tt>cat1</tt> and <tt>cat2</tt>, the result
10963 of <tt>(cat1 &amp; ~cat2)</tt> is valid, and equals the setwise union of
10964 those categories found in <tt>cat1</tt> but not found in <tt>cat2</tt>.
10965 [Footnote: it is not required that <tt>all</tt> equal the setwise union
10966 of the other enumerated values; implementations may add extra categories.]
10967 </p>
10968 </blockquote>
10969 </blockquote>
10970 <hr>
10971 <a name="349"><h3>349.&nbsp;Minor typographical error in ostream_iterator</h3></a><p><b>Section:</b>&nbsp;24.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.ostream.iterator"> [lib.ostream.iterator]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Andy Sawyer&nbsp; <b>Date:</b>&nbsp;24 Oct 2001</p>
10972 <p>24.5.2 [lib.ostream.iterator] states:</p>
10973 <pre> [...]
10975 private:
10976 // basic_ostream&lt;charT,traits&gt;* out_stream; exposition only
10977 // const char* delim; exposition only
10978 </pre>
10980 <p>Whilst it's clearly marked "exposition only", I suspect 'delim'
10981 should be of type 'const charT*'.</p>
10982 <p><b>Proposed resolution:</b></p>
10984 In 24.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.ostream.iterator"> [lib.ostream.iterator]</a>, replace <tt>const char* delim</tt> with
10985 <tt>const charT* delim</tt>.
10986 </p>
10987 <hr>
10988 <a name="352"><h3>352.&nbsp;missing fpos requirements</h3></a><p><b>Section:</b>&nbsp;21.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.typedefs"> [lib.char.traits.typedefs]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;2 Dec 2001</p>
10990 <i>(1)</i>
10991 There are no requirements on the <tt>stateT</tt> template parameter of
10992 <tt>fpos</tt> listed in 27.4.3. The interface appears to require that
10993 the type be at least Assignable and CopyConstructible (27.4.3.1, p1),
10994 and I think also DefaultConstructible (to implement the operations in
10995 Table 88).
10996 </p>
10998 21.1.2, p3, however, only requires that
10999 <tt>char_traits&lt;charT&gt;::state_type</tt> meet the requirements of
11000 CopyConstructible types.
11001 </p>
11003 <i>(2)</i>
11004 Additionally, the <tt>stateT</tt> template argument has no
11005 corresponding typedef in fpos which might make it difficult to use in
11006 generic code.
11007 </p>
11008 <p><b>Proposed resolution:</b></p>
11010 Modify 21.1.2, p4 from
11011 </p>
11013 Requires: <tt>state_type</tt> shall meet the requirements of
11014 CopyConstructible types (20.1.3).
11015 </p>
11017 Requires: state_type shall meet the requirements of Assignable
11018 (23.1, p4), CopyConstructible (20.1.3), and
11019 DefaultConstructible (20.1.4) types.
11020 </p>
11022 <p><b>Rationale:</b></p>
11023 <p>The LWG feels this is two issues, as indicated above. The first is
11024 a defect---std::basic_fstream is unimplementable without these
11025 additional requirements---and the proposed resolution fixes it. The
11026 second is questionable; who would use that typedef? The class
11027 template fpos is used only in a very few places, all of which know the
11028 state type already. Unless motivation is provided, the second should
11029 be considered NAD.</p>
11030 <hr>
11031 <a name="354"><h3>354.&nbsp;Associative container lower/upper bound requirements</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Hans Aberg&nbsp; <b>Date:</b>&nbsp;17 Dec 2001</p>
11033 Discussions in the thread "Associative container lower/upper bound
11034 requirements" on comp.std.c++ suggests that there is a defect in the
11035 C++ standard, Table 69 of section 23.1.2, "Associative containers",
11036 [lib.associative.reqmts]. It currently says:</p>
11038 <blockquote>
11040 a.find(k): returns an iterator pointing to an element with the key equivalent to
11041 k, or a.end() if such an element is not found.
11042 </p>
11045 a.lower_bound(k): returns an iterator pointing to the first element with
11046 key not less than k.
11047 </p>
11050 a.upper_bound(k): returns an iterator pointing to the first element with
11051 key greater than k.
11052 </p>
11053 </blockquote>
11056 We have "or a.end() if such an element is not found" for
11057 <tt>find</tt>, but not for <tt>upper_bound</tt> or
11058 <tt>lower_bound</tt>. As the text stands, one would be forced to
11059 insert a new element into the container and return an iterator to that
11060 in case the sought iterator does not exist, which does not seem to be
11061 the intention (and not possible with the "const" versions).
11062 </p>
11063 <p><b>Proposed resolution:</b></p>
11065 <p>Change Table 69 of section 23.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.associative.reqmts"> [lib.associative.reqmts]</a> indicated entries
11066 to:</p>
11068 <blockquote>
11070 a.lower_bound(k): returns an iterator pointing to the first element with
11071 key not less than k, or a.end() if such an element is not found.
11072 </p>
11075 a.upper_bound(k): returns an iterator pointing to the first element with
11076 key greater than k, or a.end() if such an element is not found.
11077 </p>
11078 </blockquote>
11080 <p><i>[Curaçao: LWG reviewed PR.]</i></p>
11082 <hr>
11083 <a name="355"></a><h3><a name="355">355.&nbsp;Operational semantics for a.back()</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Yaroslav Mironov&nbsp; <b>Date:</b>&nbsp;23 Jan 2002</p>
11085 <p>Table 68 "Optional Sequence Operations" in 23.1.1/12
11086 specifies operational semantics for "a.back()" as
11087 "*--a.end()", which may be ill-formed <i>[because calling
11088 operator-- on a temporary (the return) of a built-in type is
11089 ill-formed]</i>, provided a.end() returns a simple pointer rvalue
11090 (this is almost always the case for std::vector::end(), for
11091 example). Thus, the specification is not only incorrect, it
11092 demonstrates a dangerous construct: "--a.end()" may
11093 successfully compile and run as intended, but after changing the type
11094 of the container or the mode of compilation it may produce
11095 compile-time error. </p>
11097 <p><b>Proposed resolution:</b></p>
11098 <p>Change the specification in table 68 "Optional Sequence
11099 Operations" in 23.1.1/12 for "a.back()" from</p>
11102 <blockquote>
11103 *--a.end()
11104 </blockquote>
11106 <p>to</p>
11108 <blockquote>
11109 { iterator tmp = a.end(); --tmp; return *tmp; }
11110 </blockquote>
11112 <p>and the specification for "a.pop_back()" from</p>
11114 <blockquote>
11115 a.erase(--a.end())
11116 </blockquote>
11118 <p>to</p>
11120 <blockquote>
11121 { iterator tmp = a.end(); --tmp; a.erase(tmp); }
11122 </blockquote>
11124 <p><i>[Curaçao: LWG changed PR from "{ X::iterator tmp =
11125 a.end(); return *--tmp; }" to "*a.rbegin()", and from
11126 "{ X::iterator tmp = a.end(); a.erase(--tmp); }" to
11127 "a.erase(rbegin())".]</i></p>
11129 <p><i>[There is a second possible defect; table 68 "Optional
11130 Sequence Operations" in the "Operational Semantics"
11131 column uses operations present only in the "Reversible
11132 Container" requirements, yet there is no stated dependency
11133 between these separate requirements tables. Ask in Santa Cruz if the
11134 LWG would like a new issue opened.]</i></p>
11136 <p><i>[Santa Cruz: the proposed resolution is even worse than what's in
11137 the current standard: erase is undefined for reverse iterator. If
11138 we're going to make the change, we need to define a temporary and
11139 use operator--. Additionally, we don't know how prevalent this is:
11140 do we need to make this change in more than one place? Martin has
11141 volunteered to review the standard and see if this problem occurs
11142 elsewhere.]</i></p>
11144 <p><i>[Oxford: Matt provided new wording to address the concerns raised
11145 in Santa Cruz. It does not appear that this problem appears
11146 anywhere else in clauses 23 or 24.]</i></p>
11148 <p><i>[Kona: In definition of operational semantics of back(), change
11149 "*tmp" to "return *tmp;"]</i></p>
11151 <hr>
11152 <a name="358"></a><h3><a name="358">358.&nbsp;interpreting <tt>thousands_sep</tt> after a <tt>decimal_point</tt>
11153 </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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;12 Mar 2002</p>
11155 I don't think <tt>thousands_sep</tt> is being treated correctly after
11156 decimal_point has been seen. Since grouping applies only to the
11157 integral part of the number, the first such occurrence should, IMO,
11158 terminate Stage 2. (If it does not terminate it, then 22.2.2.1.2, p12
11159 and 22.2.3.1.2, p3 need to explain how <tt>thousands_sep</tt> is to be
11160 interpreted in the fractional part of a number.)
11161 </p>
11164 The easiest change I can think of that resolves this issue would be
11165 something like below.
11166 </p>
11167 <p><b>Proposed resolution:</b></p>
11169 Change the first sentence of 22.2.2.1.2, p9 from
11170 </p>
11172 <blockquote>
11173 If discard is true then the position of the character is
11174 remembered, but the character is otherwise ignored. If it is not
11175 discarded, then a check is made to determine if c is allowed as
11176 the next character of an input field of the conversion specifier
11177 returned by stage 1. If so it is accumulated.
11178 </blockquote>
11180 <p>to</p>
11182 <blockquote>
11183 If <tt>discard</tt> is true, then if <tt>'.'</tt> has not yet been
11184 accumulated, then the position of the character is remembered, but
11185 the character is otherwise ignored. Otherwise, if <tt>'.'</tt> has
11186 already been accumulated, the character is discarded and Stage 2
11187 terminates. ...
11188 </blockquote>
11190 <p><b>Rationale:</b></p>
11191 <p>We believe this reflects the intent of the Standard. Thousands sep
11192 characters after the decimal point are not useful in any locale.
11193 Some formatting conventions do group digits that follow the decimal
11194 point, but they usually introduce a different grouping character
11195 instead of reusing the thousand sep character. If we want to add
11196 support for such conventions, we need to do so explicitly.</p>
11198 <hr>
11199 <a name="359"><h3>359.&nbsp;num_put&lt;&gt;::do_put (..., bool) undocumented</h3></a><p><b>Section:</b>&nbsp;22.2.2.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.members"> [lib.facet.num.put.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;12 Mar 2002</p>
11200 <p>22.2.2.2.1, p1:</p>
11202 <pre> iter_type put (iter_type out, ios_base&amp; str, char_type fill,
11203 bool val) const;
11206 1 Returns: do_put (out, str, fill, val).
11207 </pre>
11209 <p>AFAICS, the behavior of do_put (..., bool) is not documented anywhere,
11210 however, 22.2.2.2.2, p23:</p>
11212 <blockquote>
11213 <pre>iter_type put (iter_type out, ios_base&amp; str, char_type fill,
11214 bool val) const;
11215 </pre>
11218 Effects: If (str.flags() &amp; ios_base::boolalpha) == 0 then do
11219 out = do_put(out, str, fill, (int)val)
11220 Otherwise do
11221 <pre> string_type s =
11222 val ? use_facet&lt;ctype&lt;charT&gt; &gt;(loc).truename()
11223 : use_facet&lt;ctype&lt;charT&gt; &gt;(loc).falsename();
11224 </pre>
11225 and then insert the characters of s into out. <i>out</i>.
11226 </blockquote>
11229 This means that the bool overload of <tt>do_put()</tt> will never be called,
11230 which contradicts the first paragraph. Perhaps the declaration
11231 should read <tt>do_put()</tt>, and not <tt>put()</tt>?
11232 </p>
11235 Note also that there is no <b>Returns</b> clause for this function, which
11236 should probably be corrected, just as should the second occurrence
11237 of <i>"out."</i> in the text.
11238 </p>
11241 I think the least invasive change to fix it would be something like
11242 the following:
11243 </p>
11244 <p><b>Proposed resolution:</b></p>
11245 <p>In 22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>, just above paragraph 1, remove
11246 the <tt>bool</tt> overload.</p>
11249 In 22.2.2.2.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.facet.num.put.virtuals"> [lib.facet.num.put.virtuals]</a>, p23, make the following changes
11250 </p>
11252 <blockquote>
11253 Replace <tt>put()</tt> with <tt>do_put()</tt> in the declaration
11254 of the member function.
11255 </blockquote>
11257 <blockquote>
11258 Change the <b>Effects</b> clause to a <b>Returns</b> clause (to
11259 avoid the requirement to call <tt>do_put(..., int)</tt> from <tt>
11260 do_put (..., bool))</tt>
11261 like so:
11262 </blockquote>
11264 <blockquote>
11265 23 <b>Returns</b>: If <tt>(str.flags() &amp;
11266 ios_base::boolalpha) == 0</tt> then
11267 <tt>do_put (out, str, fill, (long)val)</tt>
11268 Otherwise the function obtains a string <tt>s</tt> as if by
11269 <pre> string_type s =
11270 val ? use_facet&lt;ctype&lt;charT&gt; &gt;(loc).truename()
11271 : use_facet&lt;ctype&lt;charT&gt; &gt;(loc).falsename();
11272 </pre>
11273 and then inserts each character <tt>c</tt> of s into out via
11274 <tt>*out++ = c</tt>
11275 and returns <tt>out</tt>.
11276 </blockquote>
11278 <p><b>Rationale:</b></p>
11280 This fixes a couple of obvious typos, and also fixes what appears to
11281 be a requirement of gratuitous inefficiency.
11282 </p>
11283 <hr>
11284 <a name="360"><h3>360.&nbsp;locale mandates inefficient implementation</h3></a><p><b>Section:</b>&nbsp;22.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale"> [lib.locale]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;12 Mar 2002</p>
11286 22.1.1, p7 (copied below) allows iostream formatters and extractors
11287 to make assumptions about the values returned from facet members.
11288 However, such assumptions are apparently not guaranteed to hold
11289 in other cases (e.g., when the facet members are being called directly
11290 rather than as a result of iostream calls, or between successive
11291 calls to the same iostream functions with no interevening calls to
11292 <tt>imbue()</tt>, or even when the facet member functions are called
11293 from other member functions of other facets). This restriction
11294 prevents locale from being implemented efficiently.
11295 </p>
11296 <p><b>Proposed resolution:</b></p>
11297 <p>Change the first sentence in 22.1.1, p7 from</p>
11298 <blockquote>
11299 In successive calls to a locale facet member function during
11300 a call to an iostream inserter or extractor or a streambuf member
11301 function, the returned result shall be identical. [Note: This
11302 implies that such results may safely be reused without calling
11303 the locale facet member function again, and that member functions
11304 of iostream classes cannot safely call <tt>imbue()</tt>
11305 themselves, except as specified elsewhere. --end note]
11306 </blockquote>
11308 <p>to</p>
11310 <blockquote>
11311 In successive calls to a locale facet member function on a facet
11312 object installed in the same locale, the returned result shall be
11313 identical. ...
11314 </blockquote>
11316 <p><b>Rationale:</b></p>
11317 <p>This change is reasonable becuase it clarifies the intent of this
11318 part of the standard.</p>
11319 <hr>
11320 <a name="363"><h3>363.&nbsp;Missing exception specification in 27.4.2.1.1</h3></a><p><b>Section:</b>&nbsp;27.4.2.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios::failure"> [lib.ios::failure]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown and Marc Paterno&nbsp; <b>Date:</b>&nbsp;20 May 2002</p>
11322 The destructor of ios_base::failure should have an empty throw
11323 specification, because the destructor of its base class, exception, is
11324 declared in this way.
11325 </p>
11326 <p><b>Proposed resolution:</b></p>
11327 <p>Change the destructor to</p>
11328 <pre> virtual ~failure() throw();
11329 </pre>
11330 <p><b>Rationale:</b></p>
11331 <p>Fixes an obvious glitch. This is almost editorial.</p>
11332 <hr>
11333 <a name="364"><h3>364.&nbsp;Inconsistent wording in 27.5.2.4.2</h3></a><p><b>Section:</b>&nbsp;27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown, Marc Paterno&nbsp; <b>Date:</b>&nbsp;10 May 2002</p>
11335 27.5.2.4.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.streambuf.virt.buffer"> [lib.streambuf.virt.buffer]</a> paragraph 1 is inconsistent with the Effects
11336 clause for seekoff.
11337 </p>
11338 <p><b>Proposed resolution:</b></p>
11340 Make this paragraph, the Effects clause for setbuf, consistent in wording
11341 with the Effects clause for seekoff in paragraph 3 by amending paragraph 1
11342 to indicate the purpose of setbuf:
11343 </p>
11345 <p>Original text:</p>
11347 <blockquote>
11348 1 Effects: Performs an operation that is defined separately for each
11349 class derived from basic_streambuf in this clause (27.7.1.3, 27.8.1.4).
11350 </blockquote>
11352 <p>Proposed text:</p>
11354 <blockquote>
11355 1 Effects: Influences stream buffering in a way that is defined separately
11356 for each class derived from basic_streambuf in this clause
11357 (27.7.1.3, 27.8.1.4).
11358 </blockquote>
11360 <p><b>Rationale:</b></p>
11361 <p>The LWG doesn't believe there is any normative difference between
11362 the existing wording and what's in the proposed resolution, but the
11363 change may make the intent clearer.</p>
11364 <hr>
11365 <a name="365"><h3>365.&nbsp;Lack of const-qualification in clause 27</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Walter Brown, Marc Paterno&nbsp; <b>Date:</b>&nbsp;10 May 2002</p>
11367 Some stream and streambuf member functions are declared non-const,
11368 even thought they appear only to report information rather than to
11369 change an object's logical state. They should be declared const. See
11370 document N1360 for details and rationale.
11371 </p>
11373 <p>The list of member functions under discussion: <tt>in_avail</tt>,
11374 <tt>showmanyc</tt>, <tt>tellg</tt>, <tt>tellp</tt>, <tt>is_open</tt>.</p>
11376 <p>Related issue: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#73">73</a></p>
11378 <p><b>Proposed resolution:</b></p>
11379 <p>In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13</p>
11380 <p>Replace</p>
11381 <pre> bool is_open();
11382 </pre>
11383 <p>with</p>
11384 <pre> bool is_open() const;
11385 </pre>
11386 <p><b>Rationale:</b></p>
11387 <p>Of the changes proposed in N1360, the only one that is safe is
11388 changing the filestreams' is_open to const. The LWG believed that
11389 this was NAD the first time it considered this issue (issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#73">73</a>), but now thinks otherwise. The corresponding streambuf
11390 member function, after all,is already const.</p>
11392 <p>The other proposed changes are less safe, because some streambuf
11393 functions that appear merely to report a value do actually perform
11394 mutating operations. It's not even clear that they should be
11395 considered "logically const", because streambuf has two interfaces, a
11396 public one and a protected one. These functions may, and often do,
11397 change the state as exposed by the protected interface, even if the
11398 state exposed by the public interface is unchanged.</p>
11400 <p>Note that implementers can make this change in a binary compatible
11401 way by providing both overloads; this would be a conforming extension.</p>
11403 <hr>
11404 <a name="370"><h3>370.&nbsp;Minor error in basic_istream::get</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Ray Lischner&nbsp; <b>Date:</b>&nbsp;15 Jul 2002</p>
11405 <p>Defect report for description of basic_istream::get (section 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 15. The description for the get function
11406 with the following signature:</p>
11408 <pre> basic_istream&lt;charT,traits&gt;&amp; get(basic_streambuf&lt;char_type,traits&gt;&amp;
11409 sb);
11410 </pre>
11412 <p>is incorrect. It reads</p>
11414 <blockquote>
11415 Effects: Calls get(s,n,widen('\n'))
11416 </blockquote>
11418 <p>which I believe should be:</p>
11420 <blockquote>
11421 Effects: Calls get(sb,widen('\n'))
11422 </blockquote>
11423 <p><b>Proposed resolution:</b></p>
11424 <p>Change the <b>Effects</b> paragraph to:</p>
11425 <blockquote>
11426 Effects: Calls get(sb,this-&gt;widen('\n'))
11427 </blockquote>
11429 <p><i>[Pre-Oxford: Minor correction from Howard: replaced 'widen'
11430 with 'this-&gt;widen'.]</i></p>
11432 <p><b>Rationale:</b></p>
11433 <p>Fixes an obvious typo.</p>
11434 <hr>
11435 <a name="373"></a><h3><a name="373">373.&nbsp;Are basic_istream and basic_ostream to use (exceptions()&amp;badbit) != 0 ?</a></h3><p><b>Section:</b>&nbsp;27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a>, 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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Keith Baker&nbsp; <b>Date:</b>&nbsp;23 Jul 2002</p>
11438 In 27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a> and 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>
11439 (exception()&amp;badbit) != 0 is used in testing for rethrow, yet
11440 exception() is the constructor to class std::exception in 18.6.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.exception"> [lib.exception]</a> that has no return type. Should member function
11441 exceptions() found in 27.4.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ios"> [lib.ios]</a> be used instead?
11442 </p>
11444 <p><b>Proposed resolution:</b></p>
11446 In 27.6.1.2.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.formatted.reqmts"> [lib.istream.formatted.reqmts]</a> and 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>, change
11447 "(exception()&amp;badbit) != 0" to "(exceptions()&amp;badbit) != 0".
11448 </p>
11449 <p><b>Rationale:</b></p>
11450 <p>Fixes an obvious typo.</p>
11451 <hr>
11452 <a name="375"></a><h3><a name="375">375.&nbsp;basic_ios should be ios_base in 27.7.1.3</a></h3><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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Ray Lischner&nbsp; <b>Date:</b>&nbsp;14 Aug 2002</p>
11454 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, Table 91, and paragraph
11455 14 all contain references to "basic_ios::" which should be
11456 "ios_base::".
11457 </p>
11458 <p><b>Proposed resolution:</b></p>
11460 Change all references to "basic_ios" in Table 90, Table 91, and
11461 paragraph 14 to "ios_base".
11462 </p>
11463 <p><b>Rationale:</b></p>
11464 <p>Fixes an obvious typo.</p>
11465 <hr>
11466 <a name="379"><h3>379.&nbsp;nonsensical ctype::do_widen() requirement</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;6 Sep 2002</p>
11468 The last sentence in 22.2.1.1.2, p11 below doesn't seem to make sense.
11469 </p>
11470 <pre> charT do_widen (char c) const;
11472 -11- Effects: Applies the simplest reasonable transformation from
11473 a char value or sequence of char values to the corresponding
11474 charT value or values. The only characters for which unique
11475 transformations are required are those in the basic source
11476 character set (2.2). For any named ctype category with a
11477 ctype&lt;charT&gt; facet ctw and valid ctype_base::mask value
11478 M (is(M, c) || !ctw.is(M, do_widen(c))) is true.
11479 </pre>
11481 Shouldn't the last sentence instead read
11482 </p>
11483 <pre> For any named ctype category with a ctype&lt;char&gt; facet ctc
11484 and valid ctype_base::mask value M
11485 (ctc.is(M, c) || !is(M, do_widen(c))) is true.
11486 </pre>
11488 I.e., if the narrow character c is not a member of a class of
11489 characters then neither is the widened form of c. (To paraphrase
11490 footnote 224.)
11491 </p>
11492 <p><b>Proposed resolution:</b></p>
11494 Replace the last sentence of 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>, p11 with the
11495 following text:
11496 </p>
11497 <pre> For any named ctype category with a ctype&lt;char&gt; facet ctc
11498 and valid ctype_base::mask value M,
11499 (ctc.is(M, c) || !is(M, do_widen(c))) is true.
11500 </pre>
11502 <p><i>[Kona: Minor edit. Added a comma after the <i>M</i> for clarity.]</i></p>
11504 <p><b>Rationale:</b></p>
11505 <p>The LWG believes this is just a typo, and that this is the correct fix.</p>
11506 <hr>
11507 <a name="380"><h3>380.&nbsp;typos in codecvt tables 53 and 54</h3></a><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;6 Sep 2002</p>
11509 Tables 53 and 54 in 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> are both titled "convert
11510 result values," when surely "do_in/do_out result values" must have
11511 been intended for Table 53 and "do_unshift result values" for Table
11513 </p>
11515 Table 54, row 3 says that the meaning of partial is "more characters
11516 needed to be supplied to complete termination." The function is not
11517 supplied any characters, it is given a buffer which it fills with
11518 characters or, more precisely, destination elements (i.e., an escape
11519 sequence). So partial means that space for more than (to_limit - to)
11520 destination elements was needed to terminate a sequence given the
11521 value of state.
11522 </p>
11523 <p><b>Proposed resolution:</b></p>
11525 Change the title of Table 53 to "do_in/do_out result values" and
11526 the title of Table 54 to "do_unshift result values."
11527 </p>
11529 Change the text in Table 54, row 3 (the <b>partial</b> row), under the
11530 heading Meaning, to "space for more than (to_limit - to) destination
11531 elements was needed to terminate a sequence given the value of state."
11532 </p>
11533 <hr>
11534 <a name="381"></a><h3><a name="381">381.&nbsp;detection of invalid mbstate_t in codecvt</a></h3><p><b>Section:</b>&nbsp;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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;6 Sep 2002</p>
11536 All but one codecvt member functions that take a state_type argument
11537 list as one of their preconditions that the state_type argument have
11538 a valid value. However, according to 22.2.1.5.2, p6,
11539 codecvt::do_unshift() is the only codecvt member that is supposed to
11540 return error if the state_type object is invalid.
11541 </p>
11544 It seems to me that the treatment of state_type by all codecvt member
11545 functions should be the same and the current requirements should be
11546 changed. Since the detection of invalid state_type values may be
11547 difficult in general or computationally expensive in some specific
11548 cases, I propose the following:
11549 </p>
11550 <p><b>Proposed resolution:</b></p>
11552 Add a new paragraph before 22.2.1.5.2, p5, and after the function
11553 declaration below
11554 </p>
11555 <pre> result do_unshift(stateT&amp; state,
11556 externT* to, externT* to_limit, externT*&amp; to_next) const;
11557 </pre>
11559 as follows:
11560 </p>
11561 <pre> Requires: (to &lt;= to_end) well defined and true; state initialized,
11562 if at the beginning of a sequence, or else equal to the result of
11563 converting the preceding characters in the sequence.
11564 </pre>
11566 and change the text in Table 54, row 4, the <b>error</b> row, under
11567 the heading Meaning, from
11568 </p>
11569 <pre> state has invalid value
11570 </pre>
11573 </p>
11574 <pre> an unspecified error has occurred
11575 </pre>
11576 <p><b>Rationale:</b></p>
11577 <p>The intent is that implementations should not be required to detect
11578 invalid state values; such a requirement appears nowhere else. An
11579 invalid state value is a precondition violation, <i>i.e.</i> undefined
11580 behavior. Implementations that do choose to detect invalid state
11581 values, or that choose to detect any other kind of error, may return
11582 <b>error</b> as an indication.</p>
11583 <hr>
11584 <a name="383"><h3>383.&nbsp;Bidirectional iterator assertion typo</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>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;ysapir (submitted via comp.std.c++)&nbsp; <b>Date:</b>&nbsp;17 Oct 2002</p>
11586 Following a discussion on the boost list regarding end iterators and
11587 the possibility of performing operator--() on them, it seems to me
11588 that there is a typo in the standard. This typo has nothing to do
11589 with that discussion.
11590 </p>
11593 I have checked this newsgroup, as well as attempted a search of the
11594 Active/Defect/Closed Issues List on the site for the words "s is
11595 derefer" so I believe this has not been proposed before. Furthermore,
11596 the "Lists by Index" mentions only DR <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a> on section
11597 24.1.4, and DR <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a> is not related to this issue.
11598 </p>
11601 The standard makes the following assertion on bidirectional iterators,
11602 in section 24.1.4 [lib.bidirectional.iterators], Table 75:
11603 </p>
11605 <pre> operational assertion/note
11606 expression return type semantics pre/post-condition
11608 --r X&amp; pre: there exists s such
11609 that r == ++s.
11610 post: s is dereferenceable.
11611 --(++r) == r.
11612 --r == --s implies r == s.
11613 &amp;r == &amp;--r.
11614 </pre>
11617 (See <a href="http://aspn.activestate.com/ASPN/Mail/Message/boost/1395763">http://aspn.activestate.com/ASPN/Mail/Message/boost/1395763</a>.)
11618 </p>
11621 In particular, "s is dereferenceable" seems to be in error. It seems
11622 that the intention was to say "r is dereferenceable".
11623 </p>
11626 If it were to say "r is dereferenceable" it would
11627 make perfect sense. Since s must be dereferenceable prior to
11628 operator++, then the natural result of operator-- (to undo operator++)
11629 would be to make r dereferenceable. Furthermore, without other
11630 assertions, and basing only on precondition and postconditions, we
11631 could not otherwise know this. So it is also interesting information.
11632 </p>
11634 <p><b>Proposed resolution:</b></p>
11636 Change the guarantee to "postcondition: r is dereferenceable."
11637 </p>
11638 <p><b>Rationale:</b></p>
11639 <p>Fixes an obvious typo</p>
11640 <hr>
11641 <a name="386"><h3>386.&nbsp;Reverse iterator's operator[] has impossible return type</h3></a><p><b>Section:</b>&nbsp;24.4.1.3.11 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.opindex"> [lib.reverse.iter.opindex]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;23 Oct 2002</p>
11642 <p>In 24.4.1.3.11 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.opindex"> [lib.reverse.iter.opindex]</a>, <tt>reverse_iterator&lt;&gt;::operator[]</tt>
11643 is specified as having a return type of <tt>reverse_iterator::reference</tt>,
11644 which is the same as <tt>iterator_traits&lt;Iterator&gt;::reference</tt>.
11645 (Where <tt>Iterator</tt> is the underlying iterator type.)</p>
11647 <p>The trouble is that <tt>Iterator</tt>'s own operator[] doesn't
11648 necessarily have a return type
11649 of <tt>iterator_traits&lt;Iterator&gt;::reference</tt>. Its
11650 return type is merely required to be convertible
11651 to <tt>Iterator</tt>'s value type. The return type specified for
11652 reverse_iterator's operator[] would thus appear to be impossible.</p>
11654 <p>With the resolution of issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">299</a>, the type of
11655 <tt>a[n]</tt> will continue to be required (for random access
11656 iterators) to be convertible to the value type, and also <tt>a[n] =
11657 t</tt> will be a valid expression. Implementations of
11658 <tt>reverse_iterator</tt> will likely need to return a proxy from
11659 <tt>operator[]</tt> to meet these requirements. As mentioned in the
11660 comment from Dave Abrahams, the simplest way to specify that
11661 <tt>reverse_iterator</tt> meet this requirement to just mandate
11662 it and leave the return type of <tt>operator[]</tt> unspecified.</p>
11664 <p><b>Proposed resolution:</b></p>
11666 <p>In 24.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.reverse.iter.requirements"> [lib.reverse.iter.requirements]</a> change:</p>
11668 <blockquote>
11669 <pre>reference operator[](difference_type n) const;
11670 </pre>
11671 </blockquote>
11673 <p>to:</p>
11675 <blockquote>
11676 <pre><b><i>unspecified</i></b> operator[](difference_type n) const; // see <font color="red">lib.random.access.iterators</font>
11677 </pre>
11678 </blockquote>
11683 <p><i>[
11684 Comments from Dave Abrahams: IMO we should resolve 386 by just saying
11685 that the return type of reverse_iterator's operator[] is
11686 unspecified, allowing the random access iterator requirements to
11687 impose an appropriate return type. If we accept 299's proposed
11688 resolution (and I think we should), the return type will be
11689 readable and writable, which is about as good as we can do.
11690 ]</i></p>
11691 <hr>
11692 <a name="389"><h3>389.&nbsp;Const overload of valarray::operator[] returns by value</h3></a><p><b>Section:</b>&nbsp;26.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.valarray"> [lib.template.valarray]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Gabriel Dos Reis&nbsp; <b>Date:</b>&nbsp;8 Nov 2002</p>
11693 <p>Consider the following program:</p>
11694 <pre> #include &lt;iostream&gt;
11695 #include &lt;ostream&gt;
11696 #include &lt;vector&gt;
11697 #include &lt;valarray&gt;
11698 #include &lt;algorithm&gt;
11699 #include &lt;iterator&gt;
11700 template&lt;typename Array&gt;
11701 void print(const Array&amp; a)
11703 using namespace std;
11704 typedef typename Array::value_type T;
11705 copy(&amp;a[0], &amp;a[0] + a.size(),
11706 ostream_iterator&lt;T&gt;(std::cout, " "));
11708 template&lt;typename T, unsigned N&gt;
11709 unsigned size(T(&amp;)[N]) { return N; }
11710 int main()
11712 double array[] = { 0.89, 9.3, 7, 6.23 };
11713 std::vector&lt;double&gt; v(array, array + size(array));
11714 std::valarray&lt;double&gt; w(array, size(array));
11715 print(v); // #1
11716 std::cout &lt;&lt; std::endl;
11717 print(w); // #2
11718 std::cout &lt;&lt; std::endl;
11720 </pre>
11722 <p>While the call numbered #1 succeeds, the call numbered #2 fails
11723 because the const version of the member function
11724 valarray&lt;T&gt;::operator[](size_t) returns a value instead of a
11725 const-reference. That seems to be so for no apparent reason, no
11726 benefit. Not only does that defeats users' expectation but it also
11727 does hinder existing software (written either in C or Fortran)
11728 integration within programs written in C++. There is no reason why
11729 subscripting an expression of type valarray&lt;T&gt; that is const-qualified
11730 should not return a const T&amp;.</p>
11731 <p><b>Proposed resolution:</b></p>
11732 <p>In the class synopsis in 26.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.template.valarray"> [lib.template.valarray]</a>, and in
11733 26.3.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.valarray.access"> [lib.valarray.access]</a> just above paragraph 1, change</p>
11734 <pre> T operator[](size_t const);
11735 </pre>
11736 <p>to</p>
11737 <pre> const T&amp; operator[](size_t const);
11738 </pre>
11740 <p><i>[Kona: fixed a minor typo: put semicolon at the end of the line
11741 wehre it belongs.]</i></p>
11743 <p><b>Rationale:</b></p>
11744 <p>Return by value seems to serve no purpose. Valaray was explicitly
11745 designed to have a specified layout so that it could easily be
11746 integrated with libraries in other languages, and return by value
11747 defeats that purpose. It is believed that this change will have no
11748 impact on allowable optimizations.</p>
11749 <hr>
11750 <a name="391"><h3>391.&nbsp;non-member functions specified as const</h3></a><p><b>Section:</b>&nbsp;22.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.conversions"> [lib.conversions]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;James Kanze&nbsp; <b>Date:</b>&nbsp;10 Dec 2002</p>
11752 The specifications of toupper and tolower both specify the functions as
11753 const, althought they are not member functions, and are not specified as
11754 const in the header file synopsis in section 22.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locales"> [lib.locales]</a>.
11755 </p>
11756 <p><b>Proposed resolution:</b></p>
11757 <p>In 22.1.3.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.conversions"> [lib.conversions]</a>, remove <tt>const</tt> from the function
11758 declarations of std::toupper and std::tolower</p>
11759 <p><b>Rationale:</b></p>
11760 <p>Fixes an obvious typo</p>
11761 <hr>
11762 <a name="395"><h3>395.&nbsp;inconsistencies in the definitions of rand() and random_shuffle()</h3></a><p><b>Section:</b>&nbsp;26.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.c.math"> [lib.c.math]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;James Kanze&nbsp; <b>Date:</b>&nbsp;3 Jan 2003</p>
11764 In 26.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-numerics.html#lib.c.math"> [lib.c.math]</a>, the C++ standard refers to the C standard for the
11765 definition of rand(); in the C standard, it is written that "The
11766 implementation shall behave as if no library function calls the rand
11767 function."
11768 </p>
11771 In 25.2.11 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.random.shuffle"> [lib.alg.random.shuffle]</a>, there is no specification as to
11772 how the two parameter version of the function generates its random
11773 value. I believe that all current implementations in fact call rand()
11774 (in contradiction with the requirement avove); if an implementation does
11775 not call rand(), there is the question of how whatever random generator
11776 it does use is seeded. Something is missing.
11777 </p>
11779 <p><b>Proposed resolution:</b></p>
11781 In [lib.c.math], add a paragraph specifying that the C definition of
11782 rand shal be modified to say that "Unless otherwise specified, the
11783 implementation shall behave as if no library function calls the rand
11784 function."
11785 </p>
11788 In [lib.alg.random.shuffle], add a sentence to the effect that "In
11789 the two argument form of the function, the underlying source of
11790 random numbers is implementation defined. [Note: in particular, an
11791 implementation is permitted to use <tt>rand</tt>.]
11792 </p>
11793 <p><b>Rationale:</b></p>
11794 <p>The original proposed resolution proposed requiring the
11795 two-argument from of <tt>random_shuffle</tt> to
11796 use <tt>rand</tt>. We don't want to do that, because some existing
11797 implementations already use something else: gcc
11798 uses <tt>lrand48</tt>, for example. Using <tt>rand</tt> presents a
11799 problem if the number of elements in the sequence is greater than
11800 RAND_MAX.</p>
11801 <hr>
11802 <a name="400"><h3>400.&nbsp;redundant type cast in lib.allocator.members</h3></a><p><b>Section:</b>&nbsp;20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Markus Mauhart&nbsp; <b>Date:</b>&nbsp;27 Feb 2003</p>
11804 20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a> allocator members, contains
11805 the following 3 lines:
11806 </p>
11808 <pre> 12 Returns: new((void *) p) T( val)
11809 void destroy(pointer p);
11810 13 Returns: ((T*) p)-&gt;~T()
11811 </pre>
11814 The type cast "(T*) p" in the last line is redundant cause
11815 we know that std::allocator&lt;T&gt;::pointer is a typedef for T*.
11816 </p>
11817 <p><b>Proposed resolution:</b></p>
11819 Replace "((T*) p)" with "p".
11820 </p>
11821 <p><b>Rationale:</b></p>
11822 <p>Just a typo, this is really editorial.</p>
11823 <hr>
11824 <a name="402"><h3>402.&nbsp;wrong new expression in [some_]allocator::construct</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>, 20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a>, &nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Markus Mauhart&nbsp; <b>Date:</b>&nbsp;27 Feb 2003</p>
11826 This applies to the new expression that is contained in both par12 of
11827 20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a> and in par2 (table 32) 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>.
11828 I think this new expression is wrong, involving unintended side
11829 effects.
11830 </p>
11833 <p>20.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.members"> [lib.allocator.members]</a> contains the following 3 lines:</p>
11835 <pre> 11 Returns: the largest value N for which the call allocate(N,0) might succeed.
11836 void construct(pointer p, const_reference val);
11837 12 Returns: new((void *) p) T( val)
11838 </pre>
11841 <p>20.1.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.allocator.requirements"> [lib.allocator.requirements]</a> in table 32 has the following line:</p>
11842 <pre> a.construct(p,t) Effect: new((void*)p) T(t)
11843 </pre>
11846 .... with the prerequisits coming from the preceding two paragraphs,
11847 especially from table 31:
11848 </p>
11850 <pre> alloc&lt;T&gt; a ;// an allocator for T
11851 alloc&lt;T&gt;::pointer p ;// random access iterator
11852 // (may be different from T*)
11853 alloc&lt;T&gt;::reference r = *p;// T&amp;
11854 T const&amp; t ;
11855 </pre>
11858 Cause of using "new" but not "::new", any existing "T::operator new"
11859 function will hide the global placement new function. When there is no
11860 "T::operator new" with adequate signature,
11861 every_alloc&lt;T&gt;::construct(..) is ill-formed, and most
11862 std::container&lt;T,every_alloc&lt;T&gt;&gt; use it; a workaround
11863 would be adding placement new and delete functions with adequate
11864 signature and semantic to class T, but class T might come from another
11865 party. Maybe even worse is the case when T has placement new and
11866 delete functions with adequate signature but with "unknown" semantic:
11867 I dont like to speculate about it, but whoever implements
11868 any_container&lt;T,any_alloc&gt; and wants to use construct(..)
11869 probably must think about it.
11870 </p>
11871 <p><b>Proposed resolution:</b></p>
11873 Replace "new" with "::new" in both cases.
11874 </p>
11875 <hr>
11876 <a name="403"><h3>403.&nbsp;basic_string::swap should not throw exceptions</h3></a><p><b>Section:</b>&nbsp;21.3.5.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::swap"> [lib.string::swap]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Beman Dawes&nbsp; <b>Date:</b>&nbsp;25 Mar 2003</p>
11879 std::basic_string, 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a> paragraph 2 says that
11880 basic_string "conforms to the requirements of a Sequence, as specified
11881 in (23.1.1)." The sequence requirements specified in (23.1.1) to not
11882 include any prohibition on swap members throwing exceptions.
11883 </p>
11886 Section 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 10 does limit conditions under
11887 which exceptions may be thrown, but applies only to "all container
11888 types defined in this clause" and so excludes basic_string::swap
11889 because it is defined elsewhere.
11890 </p>
11893 Eric Niebler points out that 21.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.basic.string"> [lib.basic.string]</a> paragraph 5 explicitly
11894 permits basic_string::swap to invalidates iterators, which is
11895 disallowed by 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 10. Thus the standard would
11896 be contradictory if it were read or extended to read as having
11897 basic_string meet 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 10 requirements.
11898 </p>
11901 Yet several LWG members have expressed the belief that the original
11902 intent was that basic_string::swap should not throw exceptions as
11903 specified by 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 10, and that the standard is
11904 unclear on this issue. The complexity of basic_string::swap is
11905 specified as "constant time", indicating the intent was to avoid
11906 copying (which could cause a bad_alloc or other exception). An
11907 important use of swap is to ensure that exceptions are not thrown in
11908 exception-safe code.
11909 </p>
11912 Note: There remains long standing concern over whether or not it is
11913 possible to reasonably meet the 23.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.container.requirements"> [lib.container.requirements]</a> paragraph 10 swap
11914 requirements when allocators are unequal. The specification of
11915 basic_string::swap exception requirements is in no way intended to
11916 address, prejudice, or otherwise impact that concern.
11917 </p>
11923 <p><b>Proposed resolution:</b></p>
11925 In 21.3.5.8 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::swap"> [lib.string::swap]</a>, add a throws clause:
11926 </p>
11929 Throws: Shall not throw exceptions.
11930 </p>
11931 <hr>
11932 <a name="404"><h3>404.&nbsp;May a replacement allocation function be declared inline?</h3></a><p><b>Section:</b>&nbsp;17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a>, 18.4.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete"> [lib.new.delete]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;24 Apr 2003</p>
11934 The eight basic dynamic memory allocation functions (single-object
11935 and array versions of ::operator new and ::operator delete, in the
11936 ordinary and nothrow forms) are replaceable. A C++ program may
11937 provide an alternative definition for any of them, which will be used
11938 in preference to the implementation's definition.
11939 </p>
11942 Three different parts of the standard mention requirements on
11943 replacement functions: 17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a>, 18.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.single"> [lib.new.delete.single]</a>
11944 and 18.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.array"> [lib.new.delete.array]</a>, and 3.7.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/basic.html#basic.stc.dynamic"> [basic.stc.dynamic]</a>.
11945 </p>
11947 <p>None of these three places say whether a replacement function may
11948 be declared inline. 18.4.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.new.delete.single"> [lib.new.delete.single]</a> paragraph 2 specifies a
11949 signature for the replacement function, but that's not enough:
11950 the <tt>inline</tt> specifier is not part of a function's signature.
11951 One might also reason from 7.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/dcl.html#dcl.fct.spec"> [dcl.fct.spec]</a> paragraph 2, which
11952 requires that "an inline function shall be defined in every
11953 translation unit in which it is used," but this may not be quite
11954 specific enough either. We should either explicitly allow or
11955 explicitly forbid inline replacement memory allocation
11956 functions.</p>
11957 <p><b>Proposed resolution:</b></p>
11959 Add a new sentence to the end of 17.4.3.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.replacement.functions"> [lib.replacement.functions]</a> paragraph 3:
11960 "The program's definitions shall not be specified as <tt>inline</tt>.
11961 No diagnostic is required."
11962 </p>
11964 <p><i>[Kona: added "no diagnostic is required"]</i></p>
11966 <p><b>Rationale:</b></p>
11968 The fact that <tt>inline</tt> isn't mentioned appears to have been
11969 nothing more than an oversight. Existing implementations do not
11970 permit inline functions as replacement memory allocation functions.
11971 Providing this functionality would be difficult in some cases, and is
11972 believed to be of limited value.
11973 </p>
11974 <hr>
11975 <a name="405"><h3>405.&nbsp;qsort and POD</h3></a><p><b>Section:</b>&nbsp;25.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.c.library"> [lib.alg.c.library]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Ray Lischner&nbsp; <b>Date:</b>&nbsp;08 Apr 2003</p>
11977 Section 25.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.c.library"> [lib.alg.c.library]</a> describes bsearch and qsort, from the C
11978 standard library. Paragraph 4 does not list any restrictions on qsort,
11979 but it should limit the base parameter to point to POD. Presumably,
11980 qsort sorts the array by copying bytes, which requires POD.
11981 </p>
11982 <p><b>Proposed resolution:</b></p>
11984 In 25.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.c.library"> [lib.alg.c.library]</a> paragraph 4, just after the declarations and
11985 before the nonnormative note, add these words: "both of which have the
11986 same behavior as the original declaration. The behavior is undefined
11987 unless the objects in the array pointed to by <i>base</i> are of POD
11988 type."
11989 </p>
11991 <p><i>[Something along these lines is clearly necessary. Matt
11992 provided wording.]</i></p>
11993 <hr>
11994 <a name="406"><h3>406.&nbsp;vector::insert(s) exception safety</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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;27 Apr 2003</p>
11996 There is a possible defect in the standard: the standard text was
11997 never intended to prevent arbitrary ForwardIterators, whose operations
11998 may throw exceptions, from being passed, and it also wasn't intended
11999 to require a temporary buffer in the case where ForwardIterators were
12000 passed (and I think most implementations don't use one). As is, the
12001 standard appears to impose requirements that aren't met by any
12002 existing implementation.
12003 </p>
12004 <p><b>Proposed resolution:</b></p>
12005 <p>Replace 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> paragraph 1 with:</p>
12006 <blockquote>
12007 1- Notes: Causes reallocation if the new size is greater than the
12008 old capacity. If no reallocation happens, all the iterators and
12009 references before the insertion point remain valid. If an exception
12010 is thrown other than by the copy constructor or assignment operator
12011 of T or by any InputIterator operation there are no effects.
12012 </blockquote>
12014 <p><i>[We probably need to say something similar for deque.]</i></p>
12016 <hr>
12017 <a name="407"><h3>407.&nbsp;Can singular iterators be destroyed?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;3 June 2003</p>
12019 Clause 24.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.requirements"> [lib.iterator.requirements]</a>, paragraph 5, says that the only expression
12020 that is defined for a singular iterator is "an assignment of a
12021 non-singular value to an iterator that holds a singular value". This
12022 means that destroying a singular iterator (e.g. letting an automatic
12023 variable go out of scope) is technically undefined behavior. This
12024 seems overly strict, and probably unintentional.
12025 </p>
12026 <p><b>Proposed resolution:</b></p>
12028 Change the sentence in question to "... the only exceptions are
12029 destroying an iterator that holds a singular value, or the assignment
12030 of a non-singular value to an iterator that holds a singular value."
12031 </p>
12032 <hr>
12033 <a name="409"><h3>409.&nbsp;Closing an fstream should clear error state</h3></a><p><b>Section:</b>&nbsp;27.8.1.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.members"> [lib.ifstream.members]</a>, 27.8.1.10 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ofstream.members"> [lib.ofstream.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Nathan Myers&nbsp; <b>Date:</b>&nbsp;3 June 2003</p>
12035 A strict reading of 27.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstreams"> [lib.fstreams]</a> shows that opening or
12036 closing a basic_[io]fstream does not affect the error bits. This
12037 means, for example, that if you read through a file up to EOF, and
12038 then close the stream and reopen it at the beginning of the file,
12039 the EOF bit in the stream's error state is still set. This is
12040 counterintuitive.
12041 </p>
12043 The LWG considered this issue once before, as issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#22">22</a>,
12044 and put in a footnote to clarify that the strict reading was indeed
12045 correct. We did that because we believed the standard was
12046 unambiguous and consistent, and that we should not make architectural
12047 changes in a TC. Now that we're working on a new revision of the
12048 language, those considerations no longer apply.
12049 </p>
12050 <p><b>Proposed resolution:</b></p>
12052 <p>Change 27.8.1.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.members"> [lib.ifstream.members]</a>, para. 3 from:</p>
12054 <blockquote>
12055 Calls rdbuf()-&gt;open(s,mode|in). If that function returns a null
12056 pointer, calls setstate(failbit) (which may throw ios_base::failure
12057 [Footnote: (lib.iostate.flags)].
12058 </blockquote>
12060 <p>to:</p>
12062 <blockquote>Calls rdbuf()-&gt;open(s,mode|in). If that function returns
12063 a null pointer, calls setstate(failbit) (which may throw
12064 ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear().
12065 </blockquote>
12067 <p>Change 27.8.1.10 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ofstream.members"> [lib.ofstream.members]</a>, para. 3 from:</p>
12069 <blockquote>Calls rdbuf()-&gt;open(s,mode|out). If that function
12070 returns a null pointer, calls setstate(failbit) (which may throw
12071 ios_base::failure [Footnote: (lib.iostate.flags)).
12072 </blockquote>
12074 <p>to:</p>
12076 <blockquote>Calls rdbuf()-&gt;open(s,mode|out). If that function
12077 returns a null pointer, calls setstate(failbit) (which may throw
12078 ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear().
12079 </blockquote>
12081 <p>Change 27.8.1.13 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstream.members"> [lib.fstream.members]</a>, para. 3 from:</p>
12083 <blockquote>Calls rdbuf()-&gt;open(s,mode), If that function returns a
12084 null pointer, calls setstate(failbit), (which may throw
12085 ios_base::failure). (lib.iostate.flags) )
12086 </blockquote>
12088 <p>to:</p>
12090 <blockquote>Calls rdbuf()-&gt;open(s,mode), If that function returns a
12091 null pointer, calls setstate(failbit), (which may throw
12092 ios_base::failure). (lib.iostate.flags) ), else calls clear().
12093 </blockquote>
12097 <p><i>[Kona: the LWG agrees this is a good idea. Post-Kona: Bill
12098 provided wording. He suggests having open, not close, clear the error
12099 flags.]</i></p>
12101 <p><i>[Post-Sydney: Howard provided a new proposed resolution. The
12102 old one didn't make sense because it proposed to fix this at the
12103 level of basic_filebuf, which doesn't have access to the stream's
12104 error state. Howard's proposed resolution fixes this at the level
12105 of the three fstream class template instead.]</i></p>
12107 <hr>
12108 <a name="410"><h3>410.&nbsp;Missing semantics for stack and queue comparison operators</h3></a><p><b>Section:</b>&nbsp;23.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.queue"> [lib.queue]</a>, 23.2.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.stack"> [lib.stack]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Hans Bos&nbsp; <b>Date:</b>&nbsp;7 Jun 2003</p>
12110 Sections 23.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.queue"> [lib.queue]</a> and 23.2.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.stack"> [lib.stack]</a> list
12111 comparison operators (==, !=, &lt;, &lt;=, &gt;, =&gt;) for queue and
12112 stack. Only the semantics for queue::operator== (23.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.queue"> [lib.queue]</a> par2) and queue::operator&lt; (23.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.queue"> [lib.queue]</a>
12113 par3) are defined.
12114 </p>
12115 <p><b>Proposed resolution:</b></p>
12117 <p>Add the following new paragraphs after 23.2.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.queue"> [lib.queue]</a>
12118 paragraph 3:</p>
12120 <blockquote>
12122 <pre> operator!=
12123 </pre>
12124 <p>Returns: <tt>x.c != y.c</tt></p>
12126 <pre> operator&gt;
12127 </pre>
12128 <p>Returns: <tt>x.c &gt; y.c</tt></p>
12130 <pre> operator&lt;=
12131 </pre>
12132 <p>Returns: <tt>x.c &lt;= y.c</tt></p>
12134 <pre> operator&gt;=
12135 </pre>
12136 <p>Returns: <tt>x.c &gt;= y.c</tt></p>
12138 </blockquote>
12140 <p>Add the following paragraphs at the end of 23.2.3.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.stack"> [lib.stack]</a>:</p>
12142 <blockquote>
12144 <pre> operator==
12145 </pre>
12146 <p>Returns: <tt>x.c == y.c</tt></p>
12148 <pre> operator&lt;
12149 </pre>
12150 <p>Returns: <tt>x.c &lt; y.c</tt></p>
12152 <pre> operator!=
12153 </pre>
12154 <p>Returns: <tt>x.c != y.c</tt></p>
12156 <pre> operator&gt;
12157 </pre>
12158 <p>Returns: <tt>x.c &gt; y.c</tt></p>
12160 <pre> operator&lt;=
12161 </pre>
12162 <p>Returns: <tt>x.c &lt;= y.c</tt></p>
12164 <pre> operator&gt;=
12165 </pre>
12166 <p>Returns: <tt>x.c &gt;= y.c</tt></p>
12168 </blockquote>
12171 <p><i>[Kona: Matt provided wording.]</i></p>
12173 <p><b>Rationale:</b></p>
12174 There isn't any real doubt about what these operators are
12175 supposed to do, but we ought to spell it out.
12176 <hr>
12177 <a name="411"><h3>411.&nbsp;Wrong names of set member functions</h3></a><p><b>Section:</b>&nbsp;25.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.set.operations"> [lib.alg.set.operations]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Daniel Frey&nbsp; <b>Date:</b>&nbsp;9 Jul 2003</p>
12179 25.3.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.set.operations"> [lib.alg.set.operations]</a> paragraph 1 reads:
12180 "The semantics of the set operations are generalized to multisets in a
12181 standard way by defining union() to contain the maximum number of
12182 occurrences of every element, intersection() to contain the minimum, and
12183 so on."
12184 </p>
12187 This is wrong. The name of the functions are set_union() and
12188 set_intersection(), not union() and intersection().
12189 </p>
12190 <p><b>Proposed resolution:</b></p>
12191 <p>Change that sentence to use the correct names.</p>
12192 <hr>
12193 <a name="412"><h3>412.&nbsp;Typo in 27.4.4.3</h3></a><p><b>Section:</b>&nbsp;27.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostate.flags"> [lib.iostate.flags]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;10 Jul 2003</p>
12195 The Effects clause in 27.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostate.flags"> [lib.iostate.flags]</a> paragraph 5 says that the
12196 function only throws if the respective bits are already set prior to
12197 the function call. That's obviously not the intent. The typo ought to
12198 be corrected and the text reworded as: "If (<i>state</i> &amp;
12199 exceptions()) == 0, returns. ..."
12200 </p>
12201 <p><b>Proposed resolution:</b></p>
12203 In 27.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostate.flags"> [lib.iostate.flags]</a> paragraph 5, replace "If (rdstate() &amp;
12204 exceptions()) == 0" with "If ((state | (rdbuf() ? goodbit : badbit))
12205 &amp; exceptions()) == 0".
12206 </p>
12208 <p><i>[Kona: the original proposed resolution wasn't quite right. We
12209 really do mean rdstate(); the ambiguity is that the wording in the
12210 standard doesn't make it clear whether we mean rdstate() before
12211 setting the new state, or rdsate() after setting it. We intend the
12212 latter, of course. Post-Kona: Martin provided wording.]</i></p>
12214 <hr>
12215 <a name="413"><h3>413.&nbsp;Proposed resolution to LDR#64 still wrong</h3></a><p><b>Section:</b>&nbsp;27.6.1.2.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream::extractors"> [lib.istream::extractors]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Bo Persson&nbsp; <b>Date:</b>&nbsp;13 Jul 2003</p>
12217 The second sentence of the proposed resolution says:
12218 </p>
12221 "If it inserted no characters because it caught an exception thrown
12222 while extracting characters from sb and ..."
12223 </p>
12226 However, we are not extracting from sb, but extracting from the
12227 basic_istream (*this) and inserting into sb. I can't really tell if
12228 "extracting" or "sb" is a typo.
12229 </p>
12231 <p><i>[
12232 Sydney: Definitely a real issue. We are, indeed, extracting characters
12233 from an istream and not from sb. The problem was there in the FDIS and
12234 wasn't fixed by issue <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#64">64</a>. Probably what was intended was
12235 to have *this instead of sb. We're talking about the exception flag
12236 state of a basic_istream object, and there's only one basic_istream
12237 object in this discussion, so that would be a consistent
12238 interpretation. (But we need to be careful: the exception policy of
12239 this member function must be consistent with that of other
12240 extractors.) PJP will provide wording.
12241 ]</i></p>
12243 <p><b>Proposed resolution:</b></p>
12244 <p>Change the sentence from:</p>
12246 <blockquote>
12247 If it inserted no characters because it caught an exception thrown
12248 while extracting characters from sb and failbit is on in exceptions(),
12249 then the caught exception is rethrown.
12250 </blockquote>
12252 <p>to:</p>
12254 <blockquote>
12255 If it inserted no characters because it caught an exception thrown
12256 while extracting characters from *this and failbit is on in exceptions(),
12257 then the caught exception is rethrown.
12258 </blockquote>
12259 <hr>
12260 <a name="414"><h3>414.&nbsp;Which iterators are invalidated by v.erase()?</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Matt Austern&nbsp; <b>Date:</b>&nbsp;19 Aug 2003</p>
12262 Consider the following code fragment:
12263 </p>
12264 <blockquote>
12265 <pre>int A[8] = { 1,3,5,7,9,8,4,2 };
12266 std::vector&lt;int&gt; v(A, A+8);
12268 std::vector&lt;int&gt;::iterator i1 = v.begin() + 3;
12269 std::vector&lt;int&gt;::iterator i2 = v.begin() + 4;
12270 v.erase(i1);
12271 </pre>
12272 </blockquote>
12275 Which iterators are invalidated by <tt>v.erase(i1)</tt>: i1, i2,
12276 both, or neither?
12277 </p>
12280 On all existing implementations that I know of, the status of i1 and
12281 i2 is the same: both of them will be iterators that point to some
12282 elements of the vector (albeit not the same elements they did
12283 before). You won't get a crash if you use them. Depending on
12284 exactly what you mean by "invalidate", you might say that neither one
12285 has been invalidated because they still point to <i>something</i>,
12286 or you might say that both have been invalidated because in both
12287 cases the elements they point to have been changed out from under the
12288 iterator.
12289 </p>
12292 The standard doesn't say either of those things. It says that erase
12293 invalidates all iterators and references "after the point of the
12294 erase". This doesn't include i1, since it's at the point of the
12295 erase instead of after it. I can't think of any sensible definition
12296 of invalidation by which one can say that i2 is invalidated but i1
12297 isn't.
12298 </p>
12301 (This issue is important if you try to reason about iterator validity
12302 based only on the guarantees in the standard, rather than reasoning
12303 from typical implementation techniques. Strict debugging modes,
12304 which some programmers find useful, do not use typical implementation
12305 techniques.)
12306 </p>
12307 <p><b>Proposed resolution:</b></p>
12309 In 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> paragraph 3, change "Invalidates all the
12310 iterators and references after the point of the erase" to
12311 "Invalidates iterators and references at or after the point of the
12312 erase".
12313 </p>
12314 <p><b>Rationale:</b></p>
12315 <p>I believe this was essentially a typographical error, and that it
12316 was taken for granted that erasing an element invalidates iterators
12317 that point to it. The effects clause in question treats iterators
12318 and references in parallel, and it would seem counterintuitive to
12319 say that a reference to an erased value remains valid.</p>
12320 <hr>
12321 <a name="415"><h3>415.&nbsp;behavior of std::ws</h3></a><p><b>Section:</b>&nbsp;27.6.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.manip"> [lib.istream.manip]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
12323 According to 27.6.1.4, the ws() manipulator is not required to construct
12324 the sentry object. The manipulator is also not a member function so the
12325 text in 27.6.1, p1 through 4 that describes the exception policy for
12326 istream member functions does not apply. That seems inconsistent with
12327 the rest of extractors and all the other input functions (i.e., ws will
12328 not cause a tied stream to be flushed before extraction, it doesn't check
12329 the stream's exceptions or catch exceptions thrown during input, and it
12330 doesn't affect the stream's gcount).
12331 </p>
12332 <p><b>Proposed resolution:</b></p>
12334 Add to 27.6.1.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.istream.manip"> [lib.istream.manip]</a>, immediately before the first sentence
12335 of paragraph 1, the following text:
12336 </p>
12338 <blockquote>
12339 Behaves as an unformatted input function (as described in
12340 27.6.1.3, paragraph 1), except that it does not count the number
12341 of characters extracted and does not affect the value returned by
12342 subsequent calls to is.gcount(). After constructing a sentry
12343 object...
12344 </blockquote>
12346 <p><i>[Post-Kona: Martin provided wording]</i></p>
12348 <hr>
12349 <a name="420"><h3>420.&nbsp;is std::FILE a complete type?</h3></a><p><b>Section:</b>&nbsp;27.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstreams"> [lib.fstreams]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
12351 7.19.1, p2, of C99 requires that the FILE type only be declared in
12352 &lt;stdio.h&gt;. None of the (implementation-defined) members of the
12353 struct is mentioned anywhere for obvious reasons.
12354 </p>
12357 C++ says in 27.8.1, p2 that FILE is a type that's defined in &lt;cstdio&gt;. Is
12358 it really the intent that FILE be a complete type or is an implementation
12359 allowed to just declare it without providing a full definition?
12360 </p>
12361 <p><b>Proposed resolution:</b></p>
12362 <p>In the first sentence of 27.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstreams"> [lib.fstreams]</a> paragraph 2, change
12363 "defined" to "declared".</p>
12364 <p><b>Rationale:</b></p>
12365 <p>We don't want to impose any restrictions beyond what the C standard
12366 already says. We don't want to make anything implementation defined,
12367 because that imposes new requirements in implementations.</p>
12368 <hr>
12369 <a name="425"><h3>425.&nbsp;return value of std::get_temporary_buffer</h3></a><p><b>Section:</b>&nbsp;20.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.temporary.buffer"> [lib.temporary.buffer]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
12371 The standard is not clear about the requirements on the value returned from
12372 a call to get_temporary_buffer(0). In particular, it fails to specify whether
12373 the call should return a distinct pointer each time it is called (like
12374 operator new), or whether the value is unspecified (as if returned by
12375 malloc). The standard also fails to mention what the required behavior
12376 is when the argument is less than 0.
12377 </p>
12378 <p><b>Proposed resolution:</b></p>
12379 <p>Change 20.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-utilities.html#lib.temporary.buffer"> [lib.temporary.buffer]</a> paragraph 2 from "...or a pair of 0
12380 values if no storage can be obtained" to "...or a pair of 0 values if
12381 no storage can be obtained or if <i>n</i> &lt;= 0."</p>
12382 <p><i>[Kona: Matt provided wording]</i></p>
12383 <hr>
12384 <a name="426"><h3>426.&nbsp;search_n(), fill_n(), and generate_n() with negative n</h3></a><p><b>Section:</b>&nbsp;25.1.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.search"> [lib.alg.search]</a>, 25.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.fill"> [lib.alg.fill]</a>, 25.2.6 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-algorithms.html#lib.alg.generate"> [lib.alg.generate]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
12386 The complexity requirements for these function templates are incorrect
12387 (or don't even make sense) for negative n:</p>
12389 <p>25.1.9, p7 (search_n):
12390 <br>
12391 Complexity: At most (last1 - first1) * count applications
12392 of the corresponding predicate.</p>
12394 <p>25.2.5, p3 (fill_n):
12395 <br>
12396 Complexity: Exactly last - first (or n) assignments.</p>
12397 <br>
12399 <p>25.2.6, p3 (generate_n):
12400 <br>
12401 Complexity: Exactly last - first (or n) assignments.</p>
12404 In addition, the Requirements or the Effects clauses for the latter two
12405 templates don't say anything about the behavior when n is negative.
12406 </p>
12407 <p><b>Proposed resolution:</b></p>
12408 <p>Change 25.1.9, p7 to</p>
12410 <blockquote>
12411 Complexity: At most (last1 - first1) * count applications
12412 of the corresponding predicate if count is positive,
12413 or 0 otherwise.
12414 </blockquote>
12416 <p>Change 25.2.5, p2 to</p>
12417 <blockquote>
12418 Effects: Assigns value through all the iterators in the range [first,
12419 last), or [first, first + n) if n is positive, none otherwise.
12420 </blockquote>
12422 <p>Change 25.2.5, p3 to:</p>
12423 <blockquote>
12424 Complexity: Exactly last - first (or n if n is positive,
12425 or 0 otherwise) assignments.
12426 </blockquote>
12429 Change 25.2.6, p1
12430 to (notice the correction for the misspelled "through"):
12431 </p>
12432 <blockquote>
12433 Effects: Invokes the function object genand assigns the return
12434 value of gen through all the iterators in the range [first, last),
12435 or [first, first + n) if n is positive, or [first, first)
12436 otherwise.
12437 </blockquote>
12439 <p>Change 25.2.6, p3 to:</p>
12440 <blockquote>
12441 Complexity: Exactly last - first (or n if n is positive,
12442 or 0 otherwise) assignments.
12443 </blockquote>
12444 <p><b>Rationale:</b></p>
12445 <p>Informally, we want to say that whenever we see a negative number
12446 we treat it the same as if it were zero. We believe the above
12447 changes do that (although they may not be the minimal way of saying
12448 so). The LWG considered and rejected the alternative of saying that
12449 negative numbers are undefined behavior.</p>
12450 <hr>
12451 <a name="428"><h3>428.&nbsp;string::erase(iterator) validity</h3></a><p><b>Section:</b>&nbsp;21.3.5.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::erase"> [lib.string::erase]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;18 Sep 2003</p>
12453 23.1.1, p3 along with Table 67 specify as a prerequisite for a.erase(q)
12454 that q must be a valid dereferenceable iterator into the sequence a.
12455 </p>
12458 However, 21.3.5.5, p5 describing string::erase(p) only requires that
12459 p be a valid iterator.
12460 </p>
12463 This may be interepreted as a relaxation of the general requirement,
12464 which is most likely not the intent.
12465 </p>
12466 <p><b>Proposed resolution:</b></p>
12467 <p>Remove 21.3.5.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string::erase"> [lib.string::erase]</a> paragraph 5.</p>
12468 <p><b>Rationale:</b></p>
12469 <p>The LWG considered two options: changing the string requirements to
12470 match the general container requirements, or just removing the
12471 erroneous string requirements altogether. The LWG chose the latter
12472 option, on the grounds that duplicating text always risks the
12473 possibility that it might be duplicated incorrectly.</p>
12474 <hr>
12475 <a name="432"><h3>432.&nbsp;stringbuf::overflow() makes only one write position available</h3></a><p><b>Section:</b>&nbsp;27.7.1.3 <a href="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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Christian W Brock&nbsp; <b>Date:</b>&nbsp;24 Sep 2003</p>
12476 <p>27.7.1.3 par 8 says:</p>
12477 <blockquote>
12478 Notes: The function can make a write position available only if
12479 ( mode &amp; ios_base::out) != 0. To make a write position
12480 available, the function reallocates (or initially allocates) an
12481 array object with a sufficient number of elements to hold the
12482 current array object (if any), plus one additional write position.
12483 If ( mode &amp; ios_base::in) != 0, the function alters the read end
12484 pointer egptr() to point just past the new write position (as
12485 does the write end pointer epptr()).
12486 </blockquote>
12489 The sentences "plus one additional write position." and especially
12490 "(as does the write end pointer epptr())" COULD by interpreted
12491 (and is interpreted by at least my library vendor) as:
12492 </p>
12494 <blockquote>
12495 post-condition: epptr() == pptr()+1
12496 </blockquote>
12499 This WOULD force sputc() to call the virtual overflow() each time.
12500 </p>
12502 <p>The proposed change also affects Defect Report 169.</p>
12504 <p><b>Proposed resolution:</b></p>
12505 <p>27.7.1.1/2 Change:</p>
12507 <blockquote>
12508 2- Notes: The function allocates no array object.
12509 </blockquote>
12513 </p>
12515 <blockquote>
12516 2- Postcondition: str() == "".
12517 </blockquote>
12520 27.7.1.1/3 Change:
12521 </p>
12523 <blockquote>
12525 -3- Effects: Constructs an object of class basic_stringbuf,
12526 initializing the base class with basic_streambuf()
12527 (lib.streambuf.cons), and initializing mode with which . Then copies
12528 the content of str into the basic_stringbuf underlying character
12529 sequence and initializes the input and output sequences according to
12530 which. If which &amp; ios_base::out is true, initializes the output
12531 sequence with the underlying sequence. If which &amp; ios_base::in is
12532 true, initializes the input sequence with the underlying sequence.
12533 </p>
12534 </blockquote>
12536 <p>to:</p>
12538 <blockquote>
12540 -3- Effects: Constructs an object of class basic_stringbuf,
12541 initializing the base class with basic_streambuf()
12542 (lib.streambuf.cons), and initializing mode with which. Then copies
12543 the content of str into the basic_stringbuf underlying character
12544 sequence. If which &amp; ios_base::out is true, initializes the output
12545 sequence such that pbase() points to the first underlying character,
12546 epptr() points one past the last underlying character, and if (which &amp;
12547 ios_base::ate) is true, pptr() is set equal to
12548 epptr() else pptr() is set equal to pbase(). If which &amp; ios_base::in
12549 is true, initializes the input sequence such that eback() and gptr()
12550 point to the first underlying character and egptr() points one past
12551 the last underlying character.
12552 </p>
12553 </blockquote>
12555 <p>27.7.1.2/1 Change:</p>
12557 <blockquote>
12559 -1- Returns: A basic_string object whose content is equal to the
12560 basic_stringbuf underlying character sequence. If the buffer is only
12561 created in input mode, the underlying character sequence is equal to
12562 the input sequence; otherwise, it is equal to the output sequence. In
12563 case of an empty underlying character sequence, the function returns
12564 basic_string&lt;charT,traits,Allocator&gt;().
12565 </p>
12566 </blockquote>
12568 <p>to:</p>
12570 <blockquote>
12572 -1- Returns: A basic_string object whose content is equal to the
12573 basic_stringbuf underlying character sequence. If the basic_stringbuf
12574 was created only in input mode, the resultant basic_string contains
12575 the character sequence in the range [eback(), egptr()). If the
12576 basic_stringbuf was created with (which &amp; ios_base::out) being true
12577 then the resultant basic_string contains the character sequence in the
12578 range [pbase(), high_mark) where high_mark represents the position one
12579 past the highest initialized character in the buffer. Characters can
12580 be initialized either through writing to the stream, or by
12581 constructing the basic_stringbuf with a basic_string, or by calling
12582 the str(basic_string) member function. In the case of calling the
12583 str(basic_string) member function, all characters initialized prior to
12584 the call are now considered uninitialized (except for those
12585 characters re-initialized by the new basic_string). Otherwise the
12586 basic_stringbuf has been created in neither input nor output mode and
12587 a zero length basic_string is returned.
12588 </p>
12589 </blockquote>
12592 27.7.1.2/2 Change:
12593 </p>
12595 <blockquote>
12597 -2- Effects: If the basic_stringbuf's underlying character sequence is
12598 not empty, deallocates it. Then copies the content of s into the
12599 basic_stringbuf underlying character sequence and initializes the
12600 input and output sequences according to the mode stored when creating
12601 the basic_stringbuf object. If (mode&amp;ios_base::out) is true, then
12602 initializes the output sequence with the underlying sequence. If
12603 (mode&amp;ios_base::in) is true, then initializes the input sequence with
12604 the underlying sequence.
12605 </p>
12606 </blockquote>
12608 <p>to:</p>
12610 <blockquote>
12612 -2- Effects: Copies the content of s into the basic_stringbuf
12613 underlying character sequence. If mode &amp; ios_base::out is true,
12614 initializes the output sequence such that pbase() points to the first
12615 underlying character, epptr() points one past the last underlying
12616 character, and if (mode &amp; ios_base::ate) is true,
12617 pptr() is set equal to epptr() else pptr() is set equal to pbase(). If
12618 mode &amp; ios_base::in is true, initializes the input sequence such that
12619 eback() and gptr() point to the first underlying character and egptr()
12620 points one past the last underlying character.
12621 </p>
12622 </blockquote>
12624 <p>Remove 27.2.1.2/3. (Same rationale as issue 238: incorrect and unnecessary.)</p>
12626 <p>27.7.1.3/1 Change:</p>
12628 <blockquote>
12630 1- Returns: If the input sequence has a read position available,
12631 returns traits::to_int_type(*gptr()). Otherwise, returns
12632 traits::eof().
12633 </p>
12634 </blockquote>
12636 <p>to:</p>
12638 <blockquote>
12640 1- Returns: If the input sequence has a read position available,
12641 returns traits::to_int_type(*gptr()). Otherwise, returns
12642 traits::eof(). Any character in the underlying buffer which has been
12643 initialized is considered to be part of the input sequence.
12644 </p>
12645 </blockquote>
12647 <p>27.7.1.3/9 Change:</p>
12649 <blockquote>
12651 -9- Notes: The function can make a write position available only if (
12652 mode &amp; ios_base::out) != 0. To make a write position available, the
12653 function reallocates (or initially allocates) an array object with a
12654 sufficient number of elements to hold the current array object (if
12655 any), plus one additional write position. If ( mode &amp; ios_base::in) !=
12656 0, the function alters the read end pointer egptr() to point just past
12657 the new write position (as does the write end pointer epptr()).
12658 </p>
12659 </blockquote>
12661 <p>to:</p>
12663 <blockquote>
12665 -9- The function can make a write position available only if ( mode &amp;
12666 ios_base::out) != 0. To make a write position available, the function
12667 reallocates (or initially allocates) an array object with a sufficient
12668 number of elements to hold the current array object (if any), plus one
12669 additional write position. If ( mode &amp; ios_base::in) != 0, the
12670 function alters the read end pointer egptr() to point just past the
12671 new write position.
12672 </p>
12673 </blockquote>
12675 <p>27.7.1.3/12 Change:</p>
12677 <blockquote>
12679 -12- _ If (newoff + off) &lt; 0, or (xend - xbeg) &lt; (newoff + off), the
12680 positioning operation fails. Otherwise, the function assigns xbeg +
12681 newoff + off to the next pointer xnext .
12682 </p>
12683 </blockquote>
12685 <p>to:</p>
12687 <blockquote>
12689 -12- _ If (newoff + off) &lt; 0, or if (newoff + off) refers to an
12690 uninitialized character (as defined in 27.7.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.stringbuf.members"> [lib.stringbuf.members]</a>
12691 paragraph 1), the positioning operation fails. Otherwise, the function
12692 assigns xbeg + newoff + off to the next pointer xnext .
12693 </p>
12694 </blockquote>
12696 <p><i>[post-Kona: Howard provided wording. At Kona the LWG agreed that
12697 something along these lines was a good idea, but the original
12698 proposed resolution didn't say enough about the effect of various
12699 member functions on the underlying character sequences.]</i></p>
12701 <p><b>Rationale:</b></p>
12702 <p>The current basic_stringbuf description is over-constrained in such
12703 a way as to prohibit vendors from making this the high-performance
12704 in-memory stream it was meant to be. The fundamental problem is that
12705 the pointers: eback(), gptr(), egptr(), pbase(), pptr(), epptr() are
12706 observable from a derived client, and the current description
12707 restricts the range [pbase(), epptr()) from being grown geometrically.
12708 This change allows, but does not require, geometric growth of this
12709 range.</p>
12711 <p>Backwards compatibility issues: These changes will break code that
12712 derives from basic_stringbuf, observes epptr(), and depends upon
12713 [pbase(), epptr()) growing by one character on each call to overflow()
12714 (i.e. test suites). Otherwise there are no backwards compatibility
12715 issues.</p>
12717 <p>27.7.1.1/2: The non-normative note is non-binding, and if it were
12718 binding, would be over specification. The recommended change focuses
12719 on the important observable fact.</p>
12721 <p>27.7.1.1/3: This change does two things: 1. It describes exactly
12722 what must happen in terms of the sequences. The terms "input
12723 sequence" and "output sequence" are not well defined. 2. It
12724 introduces a common extension: open with app or ate mode. I concur
12725 with issue 238 that paragraph 4 is both wrong and unnecessary.</p>
12727 <p>27.7.1.2/1: This change is the crux of the efficiency issue. The
12728 resultant basic_string is not dependent upon epptr(), and thus
12729 implementors are free to grow the underlying buffer geometrically
12730 during overflow() *and* place epptr() at the end of that buffer.</p>
12732 <p>27.7.1.2/2: Made consistent with the proposed 27.7.1.1/3.</p>
12734 <p>27.7.1.3/1: Clarifies that characters written to the stream beyond
12735 the initially specified string are available for reading in an i/o
12736 basic_streambuf.</p>
12738 <p>27.7.1.3/9: Made normative by removing "Notes:", and removed the
12739 trailing parenthetical comment concerning epptr().</p>
12741 <p>27.7.1.3/12: Restricting the positioning to [xbeg, xend) is no
12742 longer allowable since [pbase(), epptr()) may now contain
12743 uninitialized characters. Positioning is only allowable over the
12744 initialized range.</p>
12745 <hr>
12746 <a name="434"><h3>434.&nbsp;bitset::to_string() hard to use</h3></a><p><b>Section:</b>&nbsp;23.3.5.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.bitset.members"> [lib.bitset.members]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;15 Oct 2003</p>
12748 It has been pointed out a number of times that the bitset to_string() member
12749 function template is tedious to use since callers must explicitly specify the
12750 entire template argument list (3 arguments). At least two implementations
12751 provide a number of overloads of this template to make it easier to use.
12752 </p>
12753 <p><b>Proposed resolution:</b></p>
12754 <p>In order to allow callers to specify no template arguments at all, just the
12755 first one (charT), or the first 2 (charT and traits), in addition to all
12756 three template arguments, add the following three overloads to both the
12757 interface (declarations only) of the class template bitset as well as to
12758 section 23.3.5.2, immediately after p34, the Returns clause of the existing
12759 to_string() member function template:</p>
12761 <pre> template &lt;class charT, class traits&gt;
12762 basic_string&lt;charT, traits, allocator&lt;charT&gt; &gt;
12763 to_string () const;
12765 -34.1- Returns: to_string&lt;charT, traits, allocator&lt;charT&gt; &gt;().
12767 template &lt;class charT&gt;
12768 basic_string&lt;charT, char_traits&lt;charT&gt;, allocator&lt;charT&gt; &gt;
12769 to_string () const;
12771 -34.2- Returns: to_string&lt;charT, char_traits&lt;charT&gt;, allocator&lt;charT&gt; &gt;().
12773 basic_string&lt;char, char_traits&lt;char&gt;, allocator&lt;char&gt; &gt;
12774 to_string () const;
12776 -34.3- Returns: to_string&lt;char, char_traits&lt;char&gt;, allocator&lt;char&gt; &gt;().
12777 </pre>
12779 <p><i>[Kona: the LWG agrees that this is an improvement over the
12780 status quo. Dietmar thought about an alternative using a proxy
12781 object but now believes that the proposed resolution above is the
12782 right choice.
12783 ]</i></p>
12785 <hr>
12786 <a name="435"><h3>435.&nbsp;bug in DR 25</h3></a><p><b>Section:</b>&nbsp;21.3.7.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.string.io"> [lib.string.io]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;15 Oct 2003</p>
12789 It has been pointed out that the proposed resolution in DR 25 may not be
12790 quite up to snuff: <br>
12791 http://gcc.gnu.org/ml/libstdc++/2003-09/msg00147.html
12792 http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#25<br>
12793 </p>
12796 It looks like Petur is right. The complete corrected text is copied below.
12797 I think we may have have been confused by the reference to 22.2.2.2.2 and
12798 the subsequent description of `n' which actually talks about the second
12799 argument to sputn(), not about the number of fill characters to pad with.
12800 </p>
12803 So the question is: was the original text correct? If the intent was to
12804 follow classic iostreams then it most likely wasn't, since setting width()
12805 to less than the length of the string doesn't truncate it on output. This
12806 is also the behavior of most implementations (except for SGI's standard
12807 iostreams where the operator does truncate).
12808 </p>
12809 <p><b>Proposed resolution:</b></p>
12810 <p>Change the text in 21.3.7.9, p4 from</p>
12811 <blockquote>
12812 If bool(k) is true, inserts characters as if by calling
12813 os.rdbuf()-&gt;sputn(str.data(), n), padding as described in stage 3
12814 of lib.facet.num.put.virtuals, where n is the larger of os.width()
12815 and str.size();
12816 </blockquote>
12817 <p>to</p>
12818 <blockquote>
12819 If bool(k) is true, determines padding as described in
12820 lib.facet.num.put.virtuals, and then inserts the resulting
12821 sequence of characters <tt>seq</tt> as if by calling
12822 <tt>os.rdbuf()-&gt;sputn(seq, n)</tt>, where <tt>n</tt> is the larger of
12823 <tt>os.width()</tt> and <tt>str.size()</tt>;
12824 </blockquote>
12826 <p><i>[Kona: it appears that neither the original wording, DR25, nor the
12827 proposed resolution, is quite what we want. We want to say that
12828 the string will be output, padded to os.width() if necessary. We
12829 don't want to duplicate the padding rules in clause 22, because
12830 they're complicated, but we need to be careful because they weren't
12831 quite written with quite this case in mind. We need to say what
12832 the character sequence is, and then defer to clause 22. Post-Kona:
12833 Benjamin provided wording.]</i></p>
12835 <hr>
12836 <a name="436"><h3>436.&nbsp;are cv-qualified facet types valid facets?</h3></a><p><b>Section:</b>&nbsp;22.1.1.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.facet"> [lib.locale.facet]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;15 Oct 2003</p>
12838 Is "const std::ctype&lt;char&gt;" a valid template argument to has_facet, use_facet,
12839 and the locale template ctor? And if so, does it designate the same Facet as
12840 the non-const "std::ctype&lt;char&gt;?" What about "volatile std::ctype&lt;char&gt;?"
12841 Different implementations behave differently: some fail to compile, others
12842 accept such types but behave inconsistently.
12843 </p>
12844 <p><b>Proposed resolution:</b></p>
12845 <p>Change 22.1.1.1.2, p1 to read:</p>
12847 <p>Template parameters in this clause which are required to be facets
12848 are those named Facet in declarations. A program that passes a type
12849 that is not a facet, or a type that refers to volatile-qualified
12850 facet, as an (explicit or deduced) template parameter to a locale
12851 function expecting a facet, is ill-formed. A const-qualified facet is
12852 a valid template argument to any locale function that expects a Facet
12853 template parameter.</p>
12855 <p><i>[Kona: changed the last sentence from a footnote to normative
12856 text.]</i></p>
12858 <hr>
12859 <a name="438"><h3>438.&nbsp;Ambiguity in the "do the right thing" clause</h3></a><p><b>Section:</b>&nbsp;23.1.1 <a href="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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Howard Hinnant&nbsp; <b>Date:</b>&nbsp;20 Oct 2003</p>
12861 <p>Section 23.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.sequence.reqmts"> [lib.sequence.reqmts]</a>, paragraphs 9-11, fixed up the problem
12862 noticed with statements like:</p>
12863 <pre>vector&lt;int&gt; v(10, 1);
12864 </pre>
12866 <p>The intent of the above statement was to construct with:</p>
12867 <pre>vector(size_type, const value_type&amp;);
12868 </pre>
12870 <p>but early implementations failed to compile as they bound to:</p>
12871 <pre>template &lt;class InputIterator&gt;
12872 vector(InputIterator f, InputIterator l);
12873 </pre>
12874 <p>instead.</p>
12876 <p>Paragraphs 9-11 say that if InputIterator is an integral type, then the
12877 member template constructor will have the same effect as:</p>
12878 <pre>vector&lt;static_cast&lt;size_type&gt;(f), static_cast&lt;value_type&gt;(l));
12879 </pre>
12880 <p>(and similarly for the other member template functions of sequences).</p>
12882 <p>There is also a note that describes one implementation technique:</p>
12883 <blockquote>
12884 One way that sequence implementors can satisfy this requirement is to
12885 specialize the member template for every integral type.
12886 </blockquote>
12888 <p>This might look something like:</p>
12889 <blockquote>
12890 <pre>template &lt;class T&gt;
12891 struct vector
12893 typedef unsigned size_type;
12895 explicit vector(size_type) {}
12896 vector(size_type, const T&amp;) {}
12898 template &lt;class I&gt;
12899 vector(I, I);
12901 // ...
12904 template &lt;class T&gt;
12905 template &lt;class I&gt;
12906 vector&lt;T&gt;::vector(I, I) { ... }
12908 template &lt;&gt;
12909 template &lt;&gt;
12910 vector&lt;int&gt;::vector(int, int) { ... }
12912 template &lt;&gt;
12913 template &lt;&gt;
12914 vector&lt;int&gt;::vector(unsigned, unsigned) { ... }
12916 // ...
12917 </pre>
12918 </blockquote>
12920 <p>Label this solution 'A'.</p>
12922 <p>The standard also says:</p>
12923 <blockquote>
12924 Less cumbersome implementation techniques also exist.
12925 </blockquote>
12927 A popular technique is to not specialize as above, but instead catch
12928 every call with the member template, detect the type of InputIterator,
12929 and then redirect to the correct logic. Something like:
12930 </p>
12931 <blockquote>
12932 <pre>template &lt;class T&gt;
12933 template &lt;class I&gt;
12934 vector&lt;T&gt;::vector(I f, I l)
12936 choose_init(f, l, int2type&lt;is_integral&lt;I&gt;::value&gt;());
12939 template &lt;class T&gt;
12940 template &lt;class I&gt;
12941 vector&lt;T&gt;::choose_init(I f, I l, int2type&lt;false&gt;)
12943 // construct with iterators
12946 template &lt;class T&gt;
12947 template &lt;class I&gt;
12948 vector&lt;T&gt;::choose_init(I f, I l, int2type&lt;true&gt;)
12950 size_type sz = static_cast&lt;size_type&gt;(f);
12951 value_type v = static_cast&lt;value_type&gt;(l);
12952 // construct with sz,v
12954 </pre>
12955 </blockquote>
12957 <p>Label this solution 'B'.</p>
12959 <p>Both of these solutions solve the case the standard specifically
12960 mentions:</p>
12961 <pre>vector&lt;int&gt; v(10, 1); // ok, vector size 10, initialized to 1
12962 </pre>
12965 However, (and here is the problem), the two solutions have different
12966 behavior in some cases where the value_type of the sequence is not an
12967 integral type. For example consider:
12968 </p>
12969 <blockquote><pre> pair&lt;char, char&gt; p('a', 'b');
12970 vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt; d('a', 'b');
12971 </pre></blockquote>
12973 The second line of this snippet is likely an error. Solution A catches
12974 the error and refuses to compile. The reason is that there is no
12975 specialization of the member template constructor that looks like:
12976 </p>
12977 <pre>template &lt;&gt;
12978 template &lt;&gt;
12979 vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt;::vector(char, char) { ... }
12980 </pre>
12983 So the expression binds to the unspecialized member template
12984 constructor, and then fails (compile time) because char is not an
12985 InputIterator.
12986 </p>
12989 Solution B compiles the above example though. 'a' is casted to an
12990 unsigned integral type and used to size the outer vector. 'b' is
12991 static casted to the inner vector using it's explicit constructor:
12992 </p>
12994 <pre>explicit vector(size_type n);
12995 </pre>
12998 and so you end up with a static_cast&lt;size_type&gt;('a') by
12999 static_cast&lt;size_type&gt;('b') matrix.
13000 </p>
13003 It is certainly possible that this is what the coder intended. But the
13004 explicit qualifier on the inner vector has been thwarted at any rate.
13005 </p>
13008 The standard is not clear whether the expression:
13009 </p>
13011 <pre> vector&lt;vector&lt;pair&lt;char, char&gt; &gt; &gt; d('a', 'b');
13012 </pre>
13015 (and similar expressions) are:
13016 </p>
13018 <ol>
13019 <li> undefined behavior.</li>
13020 <li> illegal and must be rejected.</li>
13021 <li> legal and must be accepted.</li>
13022 </ol>
13024 <p>My preference is listed in the order presented.</p>
13026 <p>There are still other techniques for implementing the requirements of
13027 paragraphs 9-11, namely the "restricted template technique" (e.g.
13028 enable_if). This technique is the most compact and easy way of coding
13029 the requirements, and has the behavior of #2 (rejects the above
13030 expression).
13031 </p>
13034 Choosing 1 would allow all implementation techniques I'm aware of.
13035 Choosing 2 would allow only solution 'A' and the enable_if technique.
13036 Choosing 3 would allow only solution 'B'.
13037 </p>
13040 Possible wording for a future standard if we wanted to actively reject
13041 the expression above would be to change "static_cast" in paragraphs
13042 9-11 to "implicit_cast" where that is defined by:
13043 </p>
13045 <blockquote>
13046 <pre>template &lt;class T, class U&gt;
13047 inline
13048 T implicit_cast(const U&amp; u)
13050 return u;
13052 </pre>
13053 </blockquote>
13055 <p><b>Proposed resolution:</b></p>
13057 Replace 23.1.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.sequence.reqmts"> [lib.sequence.reqmts]</a> paragraphs 9 - 11 with:
13059 <p>For every sequence defined in this clause and in clause lib.strings:</p>
13061 <ul>
13062 <li>
13063 <p>If the constructor</p>
13064 <pre> template &lt;class InputIterator&gt;
13065 X(InputIterator f, InputIterator l,
13066 const allocator_type&amp; a = allocator_type())
13067 </pre>
13068 <p>is called with a type InputIterator that does not qualify as
13069 an input iterator, then the constructor will behave as if the
13070 overloaded constructor:</p>
13071 <pre> X(size_type, const value_type&amp; = value_type(),
13072 const allocator_type&amp; = allocator_type())
13073 </pre>
13074 <p>were called instead, with the arguments static_cast&lt;size_type&gt;(f), l and a, respectively.</p>
13075 </li>
13077 <li>
13078 <p>If the member functions of the forms:</p>
13079 <pre> template &lt;class InputIterator&gt; // such as insert()
13080 rt fx1(iterator p, InputIterator f, InputIterator l);
13082 template &lt;class InputIterator&gt; // such as append(), assign()
13083 rt fx2(InputIterator f, InputIterator l);
13085 template &lt;class InputIterator&gt; // such as replace()
13086 rt fx3(iterator i1, iterator i2, InputIterator f, InputIterator l);
13087 </pre>
13088 <p>are called with a type InputIterator that does not qualify as
13089 an input iterator, then these functions will behave as if the
13090 overloaded member functions:</p>
13091 <pre> rt fx1(iterator, size_type, const value_type&amp;);
13093 rt fx2(size_type, const value_type&amp;);
13095 rt fx3(iterator, iterator, size_type, const value_type&amp;);
13096 </pre>
13097 <p>were called instead, with the same arguments.</p>
13098 </li>
13099 </ul>
13101 <p>In the previous paragraph the alternative binding will fail if f
13102 is not implicitly convertible to X::size_type or if l is not implicitly
13103 convertible to X::value_type.</p>
13106 The extent to which an implementation determines that a type cannot be
13107 an input iterator is unspecified, except that as a minimum integral
13108 types shall not qualify as input iterators.
13109 </p>
13113 <p><i>[
13114 Kona: agreed that the current standard requires <tt>v('a', 'b')</tt>
13115 to be accepted, and also agreed that this is surprising behavior. The
13116 LWG considered several options, including something like
13117 implicit_cast, which doesn't appear to be quite what we want. We
13118 considered Howards three options: allow acceptance or rejection,
13119 require rejection as a compile time error, and require acceptance. By
13120 straw poll (1-6-1), we chose to require a compile time error.
13121 Post-Kona: Howard provided wording.
13122 ]</i></p>
13124 <p><i>[
13125 Sydney: The LWG agreed with this general direction, but there was some
13126 discomfort with the wording in the original proposed resolution.
13127 Howard submitted new wording, and we will review this again in
13128 Redmond.
13129 ]</i></p>
13131 <p><i>[Redmond: one very small change in wording: the first argument
13132 is cast to size_t. This fixes the problem of something like
13133 <tt>vector&lt;vector&lt;int&gt; &gt;(5, 5)</tt>, where int is not
13134 implicitly convertible to the value type.]</i></p>
13136 <p><b>Rationale:</b></p>
13137 <p>The proposed resolution fixes:</p>
13139 <pre> vector&lt;int&gt; v(10, 1);
13140 </pre>
13143 since as integral types 10 and 1 must be disqualified as input
13144 iterators and therefore the (size,value) constructor is called (as
13145 if).</p>
13147 <p>The proposed resolution breaks:</p>
13149 <pre> vector&lt;vector&lt;T&gt; &gt; v(10, 1);
13150 </pre>
13153 because the integral type 1 is not *implicitly* convertible to
13154 vector&lt;T&gt;. The wording above requires a diagnostic.</p>
13157 The proposed resolution leaves the behavior of the following code
13158 unspecified.
13159 </p>
13161 <pre> struct A
13163 operator int () const {return 10;}
13166 struct B
13168 B(A) {}
13171 vector&lt;B&gt; v(A(), A());
13172 </pre>
13175 The implementation may or may not detect that A is not an input
13176 iterator and employee the (size,value) constructor. Note though that
13177 in the above example if the B(A) constructor is qualified explicit,
13178 then the implementation must reject the constructor as A is no longer
13179 implicitly convertible to B.
13180 </p>
13181 <hr>
13182 <a name="441"><h3>441.&nbsp;Is fpos::state const?</h3></a><p><b>Section:</b>&nbsp;27.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos"> [lib.fpos]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Vincent Leloup&nbsp; <b>Date:</b>&nbsp;17 Nov 2003</p>
13184 In section 27.4.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos.members"> [lib.fpos.members]</a> fpos&lt;stateT&gt;::state() is declared
13185 non const, but in section 27.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos"> [lib.fpos]</a> it is declared const.
13186 </p>
13187 <p><b>Proposed resolution:</b></p>
13189 In section 27.4.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fpos.members"> [lib.fpos.members]</a>, change the declaration of
13190 <tt>fpos&lt;stateT&gt;::state()</tt> to const.
13191 </p>
13192 <hr>
13193 <a name="442"><h3>442.&nbsp;sentry::operator bool() inconsistent signature</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Vincent Leloup&nbsp; <b>Date:</b>&nbsp;18 Nov 2003</p>
13195 In section 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> paragraph 4, in description part
13196 basic_ostream&lt;charT, traits&gt;::sentry::operator bool() is declared
13197 as non const, but in section 27.6.2.3, in synopsis it is declared
13198 const.
13199 </p>
13200 <p><b>Proposed resolution:</b></p>
13202 In section 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> paragraph 4, change the declaration
13203 of <tt>sentry::operator bool()</tt> to const.
13204 </p>
13205 <hr>
13206 <a name="443"><h3>443.&nbsp;filebuf::close() inconsistent use of EOF</h3></a><p><b>Section:</b>&nbsp;27.8.1.3 <a href="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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Vincent Leloup&nbsp; <b>Date:</b>&nbsp;20 Nov 2003</p>
13208 In section 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> par6, in effects description of
13209 basic_filebuf&lt;charT, traits&gt;::close(), overflow(EOF) is used twice;
13210 should be overflow(traits::eof()).
13211 </p>
13212 <p><b>Proposed resolution:</b></p>
13214 Change overflow(EOF) to overflow(traits::eof()).
13215 </p>
13216 <hr>
13217 <a name="444"><h3>444.&nbsp;Bad use of casts in fstream</h3></a><p><b>Section:</b>&nbsp;27.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstreams"> [lib.fstreams]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Vincent Leloup&nbsp; <b>Date:</b>&nbsp;20 Nov 2003</p>
13219 27.8.1.7 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ifstream.members"> [lib.ifstream.members]</a> p1, 27.8.1.10 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ofstream.members"> [lib.ofstream.members]</a> p1, 27.8.1.13 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstream.members"> [lib.fstream.members]</a> p1 seems have same problem as exposed in LWG issue
13220 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#252">252</a>.
13221 </p>
13222 <p><b>Proposed resolution:</b></p>
13224 <p><i>[Sydney: Genuine defect. 27.8.1.13 needs a cast to cast away
13225 constness. The other two places are stylistic: we could change the
13226 C-style casts to const_cast. Post-Sydney: Howard provided wording.
13227 ]</i></p>
13229 <p>Change 27.8.1.7/1 from:</p>
13230 <blockquote>
13231 Returns: (basic_filebuf&lt;charT,traits&gt;*)&amp;sb.
13232 </blockquote>
13234 <p>to:</p>
13235 <blockquote>
13236 Returns: const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb).
13237 </blockquote>
13239 <p>Change 27.8.1.10/1 from:</p>
13240 <blockquote>
13241 Returns: (basic_filebuf&lt;charT,traits&gt;*)&amp;sb.
13242 </blockquote>
13244 <p>to:</p>
13245 <blockquote>
13246 Returns: const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb).
13247 </blockquote>
13249 <p>Change 27.8.1.13/1 from:</p>
13250 <blockquote>
13251 Returns: &amp;sb.
13252 </blockquote>
13254 <p>to:</p>
13255 <blockquote>
13256 Returns: const_cast&lt;basic_filebuf&lt;charT,traits&gt;*&gt;(&amp;sb).
13257 </blockquote>
13261 <hr>
13262 <a name="445"><h3>445.&nbsp;iterator_traits::reference unspecified for some iterator categories</h3></a><p><b>Section:</b>&nbsp;24.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.traits"> [lib.iterator.traits]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;9 Dec 2003</p>
13264 The standard places no restrictions at all on the reference type
13265 of input, output, or forward iterators (for forward iterators it
13266 only specifies that *x must be value_type&amp; and doesn't mention
13267 the reference type). Bidirectional iterators' reference type is
13268 restricted only by implication, since the base iterator's
13269 reference type is used as the return type of reverse_iterator's
13270 operator*, which must be T&amp; in order to be a conforming forward
13271 iterator.
13272 </p>
13275 Here's what I think we ought to be able to expect from an input
13276 or forward iterator's reference type R, where a is an iterator
13277 and V is its value_type
13278 </p>
13280 <ul>
13281 <li>
13282 *a is convertible to R
13283 </li>
13285 <li>
13286 R is convertible to V
13287 </li>
13289 <li>
13290 static_cast&lt;V&gt;(static_cast&lt;R&gt;(*a)) is equivalent to
13291 static_cast&lt;V&gt;(*a)
13292 </li>
13293 </ul>
13295 <p>A mutable forward iterator ought to satisfy, for x of type V:</p>
13296 <li>
13297 { R r = *a; r = x; } is equivalent to *a = x;
13298 </li>
13301 I think these requirements capture existing container iterators
13302 (including vector&lt;bool&gt;'s), but render istream_iterator invalid;
13303 its reference type would have to be changed to a constant
13304 reference.
13305 </p>
13309 (Jeremy Siek) During the discussion in Sydney, it was felt that a
13310 simpler long term solution for this was needed. The solution proposed
13311 was to require <tt>reference</tt> to be the same type as <tt>*a</tt>
13312 and <tt>pointer</tt> to be the same type as <tt>a-&gt;</tt>. Most
13313 iterators in the Standard Library already meet this requirement. Some
13314 iterators are output iterators, and do not need to meet the
13315 requirement, and others are only specified through the general
13316 iterator requirements (which will change with this resolution). The
13317 sole case where there is an explicit definition of the reference type
13318 that will need to change is <tt>istreambuf_iterator</tt> which returns
13319 <tt>charT</tt> from <tt>operator*</tt> but has a reference type of
13320 <tt>charT&amp;</tt>. We propose changing the reference type of
13321 <tt>istreambuf_iterator</tt> to <tt>charT</tt>.
13322 </p>
13324 <p>The other option for resolving the issue with <tt>pointer</tt>,
13325 mentioned in the note below, is to remove <tt>pointer</tt>
13326 altogether. I prefer placing requirements on <tt>pointer</tt> to
13327 removing it for two reasons. First, <tt>pointer</tt> will become
13328 useful for implementing iterator adaptors and in particular,
13329 <tt>reverse_iterator</tt> will become more well defined. Second,
13330 removing <tt>pointer</tt> is a rather drastic and publicly-visible
13331 action to take.</p>
13333 <p>The proposed resolution technically enlarges the requirements for
13334 iterators, which means there are existing iterators (such as
13335 <tt>istreambuf_iterator</tt>, and potentially some programmer-defined
13336 iterators) that will no longer meet the requirements. Will this break
13337 existing code? The scenario in which it would is if an algorithm
13338 implementation (say in the Standard Library) is changed to rely on
13339 <tt>iterator_traits::reference</tt>, and then is used with one of the
13340 iterators that do not have an appropriately defined
13341 <tt>iterator_traits::reference</tt>.
13342 </p>
13345 <p>The proposed resolution makes one other subtle change. Previously,
13346 it was required that output iterators have a <tt>difference_type</tt>
13347 and <tt>value_type</tt> of <tt>void</tt>, which means that a forward
13348 iterator could not be an output iterator. This is clearly a mistake,
13349 so I've changed the wording to say that those types may be
13350 <tt>void</tt>.
13351 </p>
13353 <p><b>Proposed resolution:</b></p>
13355 <p>In 24.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.traits"> [lib.iterator.traits]</a>, after:</p>
13357 <blockquote>
13358 be defined as the iterator's difference type, value type and iterator
13359 category, respectively.
13360 </blockquote>
13362 <p>add</p>
13364 <blockquote>
13365 In addition, the types
13366 <pre>iterator_traits&lt;Iterator&gt;::reference
13367 iterator_traits&lt;Iterator&gt;::pointer
13368 </pre>
13369 must be defined as the iterator's reference and pointer types, that
13370 is, the same type as the type of <tt>*a</tt> and <tt>a-&gt;</tt>,
13371 respectively.
13372 </blockquote>
13374 <p>In 24.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.iterator.traits"> [lib.iterator.traits]</a>, change:</p>
13376 <blockquote>
13377 In the case of an output iterator, the types
13378 <pre>iterator_traits&lt;Iterator&gt;::difference_type
13379 iterator_traits&lt;Iterator&gt;::value_type
13380 </pre>
13381 are both defined as <tt>void</tt>.
13382 </blockquote>
13384 <p>to:</p>
13385 <blockquote>
13386 In the case of an output iterator, the types
13387 <pre>iterator_traits&lt;Iterator&gt;::difference_type
13388 iterator_traits&lt;Iterator&gt;::value_type
13389 iterator_traits&lt;Iterator&gt;::reference
13390 iterator_traits&lt;Iterator&gt;::pointer
13391 </pre>
13392 may be defined as <tt>void</tt>.
13393 </blockquote>
13395 <p>In 24.5.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iterators.html#lib.istreambuf.iterator"> [lib.istreambuf.iterator]</a>, change:</p>
13396 <blockquote>
13397 <pre>typename traits::off_type, charT*, charT&amp;&gt;
13398 </pre>
13399 </blockquote>
13400 <p>to:</p>
13401 <blockquote>
13402 <pre>typename traits::off_type, charT*, charT&gt;
13403 </pre>
13404 </blockquote>
13406 <p><i>[
13407 Redmond: there was concern in Sydney that this might not be the only place
13408 where things were underspecified and needed to be changed. Jeremy
13409 reviewed iterators in the standard and confirmed that nothing else
13410 needed to be changed.
13411 ]</i></p>
13413 <hr>
13414 <a name="448"><h3>448.&nbsp;Random Access Iterators over abstract classes</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Dave Abrahams&nbsp; <b>Date:</b>&nbsp;7 Jan 2004</p>
13416 Table 76, the random access iterator requirement table, says that the
13417 return type of a[n] must be "convertible to T". When an iterator's
13418 value_type T is an abstract class, nothing is convertible to T.
13419 Surely this isn't an intended restriction?
13420 </p>
13421 <p><b>Proposed resolution:</b></p>
13423 Change the return type to "convertible to T const&amp;".
13424 </p>
13425 <hr>
13426 <a name="449"><h3>449.&nbsp;Library Issue 306 Goes Too Far</h3></a><p><b>Section:</b>&nbsp;18.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-support.html#lib.support.types"> [lib.support.types]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Pete Becker&nbsp; <b>Date:</b>&nbsp;15 Jan 2004</p>
13427 <p>Original text:</p>
13428 <blockquote>
13429 The macro offsetof accepts a restricted set of type arguments in this
13430 International Standard. type shall be a POD structure or a POD union
13431 (clause 9). The result of applying the offsetof macro to a field that
13432 is a static data member or a function member is undefined."
13433 </blockquote>
13435 <p>Revised text:</p>
13436 <blockquote>
13437 "If type is not a POD structure or a POD union the results are undefined."
13438 </blockquote>
13441 Looks to me like the revised text should have replaced only the second
13442 sentence. It doesn't make sense standing alone.
13443 </p>
13445 <p><b>Proposed resolution:</b></p>
13446 <p>Change 18.1, paragraph 5, to:</p>
13448 <blockquote>
13449 The macro offsetof accepts a restricted set of type arguments in this
13450 International Standard. If type is not a POD structure or a POD union
13451 the results are undefined. The result of applying the offsetof macro
13452 to a field that is a static data member or a function member is
13453 undefined."
13454 </blockquote>
13455 <hr>
13456 <a name="453"><h3>453.&nbsp;basic_stringbuf::seekoff need not always fail for an empty stream</h3></a><p><b>Section:</b>&nbsp;27.7.1.3 <a href="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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;30 Jan 2004</p>
13457 <pre> pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir,
13458 ios_base::openmode);
13459 </pre>
13461 is obliged to fail if nothing has been inserted into the stream. This
13462 is unnecessary and undesirable. It should be permissible to seek to
13463 an effective offset of zero.</p>
13465 <p><i>[
13466 Sydney: Agreed that this is an annoying problem: seeking to zero should be
13467 legal. Bill will provide wording.
13468 ]</i></p>
13470 <p><b>Proposed resolution:</b></p>
13471 <p>Change the sentence from:</p>
13472 <blockquote>
13473 For a sequence to be positioned, if its next pointer (either
13474 gptr() or pptr()) is a null pointer, the positioning operation
13475 fails.
13476 </blockquote>
13478 <p>to:</p>
13480 <blockquote>
13481 For a sequence to be positioned, if its next pointer (either
13482 gptr() or pptr()) is a null pointer and the new offset newoff
13483 is nonzero, the positioning operation fails.
13484 </blockquote>
13485 <hr>
13486 <a name="455"><h3>455.&nbsp;cerr::tie() and wcerr::tie() are overspecified</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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;30 Jan 2004</p>
13488 Both cerr::tie() and wcerr::tie() are obliged to be null at program
13489 startup. This is overspecification and overkill. It is both traditional
13490 and useful to tie cerr to cout, to ensure that standard output is drained
13491 whenever an error message is written. This behavior should at least be
13492 permitted if not required. Same for wcerr::tie().
13493 </p>
13494 <p><b>Proposed resolution:</b></p>
13496 <p>Add to the description of cerr:</p>
13497 <blockquote>
13498 After the object cerr is initialized, cerr.tie() returns &amp;cout.
13499 Its state is otherwise the same as required for basic_ios&lt;char&gt;::init
13500 (lib.basic.ios.cons).
13501 </blockquote>
13503 <p>Add to the description of wcerr:</p>
13505 <blockquote>
13506 After the object wcerr is initialized, wcerr.tie() returns &amp;wcout.
13507 Its state is otherwise the same as required for basic_ios&lt;wchar_t&gt;::init
13508 (lib.basic.ios.cons).
13509 </blockquote>
13511 <p><i>[Sydney: straw poll (3-1): we should <i>require</i>, not just
13512 permit, cout and cerr to be tied on startup. Pre-Redmond: Bill will
13513 provide wording.]</i></p>
13514 <hr>
13515 <a name="457"><h3>457.&nbsp;bitset constructor: incorrect number of initialized bits</h3></a><p><b>Section:</b>&nbsp;23.3.5.1 <a href="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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Dag Henriksson&nbsp; <b>Date:</b>&nbsp;30 Jan 2004</p>
13517 The constructor from unsigned long says it initializes "the first M
13518 bit positions to the corresponding bit values in val. M is the smaller
13519 of N and the value CHAR_BIT * sizeof(unsigned long)."
13520 </p>
13523 Object-representation vs. value-representation strikes again. CHAR_BIT *
13524 sizeof (unsigned long) does not give us the number of bits an unsigned long
13525 uses to hold the value. Thus, the first M bit position above is not
13526 guaranteed to have any corresponding bit values in val.
13527 </p>
13528 <p><b>Proposed resolution:</b></p>
13529 <p>In 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> paragraph 2, change "M is the smaller of
13530 N and the value CHAR_BIT * sizeof (unsigned long). (249)" to
13531 "<tt>M</tt> is the smaller of <tt>N</tt> and the number of bits in
13532 the value representation (section 3.9 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/basic.html#basic.types"> [basic.types]</a>) of <tt>unsigned
13533 long</tt>."
13534 </p>
13535 <hr>
13536 <a name="460"><h3>460.&nbsp;Default modes missing from basic_fstream member specifications</h3></a><p><b>Section:</b>&nbsp;27.8.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstreams"> [lib.fstreams]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Ben Hutchings&nbsp; <b>Date:</b>&nbsp;1 Apr 2004</p>
13538 The second parameters of the non-default constructor and of the open
13539 member function for basic_fstream, named "mode", are optional
13540 according to the class declaration in 27.8.1.11 [lib.fstream]. The
13541 specifications of these members in 27.8.1.12 [lib.fstream.cons] and
13542 27.8.1.13 lib.fstream.members] disagree with this, though the
13543 constructor declaration has the "explicit" function-specifier implying
13544 that it is intended to be callable with one argument.
13545 </p>
13546 <p><b>Proposed resolution:</b></p>
13547 <p>In 27.8.1.12 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstream.cons"> [lib.fstream.cons]</a>, change</p>
13548 <pre> explicit basic_fstream(const char* s, ios_base::openmode mode);
13549 </pre>
13550 <p>to</p>
13551 <pre> explicit basic_fstream(const char* s,
13552 ios_base::openmode mode = ios_base::in|ios_base::out);
13553 </pre>
13554 <p>In 27.8.1.13 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.fstream.members"> [lib.fstream.members]</a>, change</p>
13555 <pre> void open(const char*s, ios_base::openmode mode);
13556 </pre>
13557 <p>to</p>
13558 void open(const char*s,
13559 ios_base::openmode mode = ios_base::in|ios_base::out);
13560 <hr>
13561 <a name="461"><h3>461.&nbsp;time_get hard or impossible to implement</h3></a><p><b>Section:</b>&nbsp;22.2.5.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-locales.html#lib.locale.time.get.virtuals"> [lib.locale.time.get.virtuals]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Bill Plauger&nbsp; <b>Date:</b>&nbsp;23 Mar 2004</p>
13563 Template time_get currently contains difficult, if not impossible,
13564 requirements for do_date_order, do_get_time, and do_get_date. All require
13565 the implementation to scan a field generated by the %x or %X conversion
13566 specifier in strftime. Yes, do_date_order can always return no_order, but
13567 that doesn't help the other functions. The problem is that %x can be
13568 nearly anything, and it can vary widely with locales. It's horribly
13569 onerous to have to parse "third sunday after Michaelmas in the year of
13570 our Lord two thousand and three," but that's what we currently ask of
13571 do_get_date. More practically, it leads some people to think that if
13572 %x produces 10.2.04, we should know to look for dots as separators. Still
13573 not easy.
13574 </p>
13577 Note that this is the <i>opposite</i> effect from the intent stated in the
13578 footnote earlier in this subclause:
13579 </p>
13581 <blockquote>
13582 "In other words, user confirmation is required for reliable parsing of
13583 user-entered dates and times, but machine-generated formats can be
13584 parsed reliably. This allows parsers to be aggressive about interpreting
13585 user variations on standard formats."
13586 </blockquote>
13589 We should give both implementers and users an easier and more reliable
13590 alternative: provide a (short) list of alternative delimiters and say
13591 what the default date order is for no_order. For backward compatibility,
13592 and maximum latitude, we can permit an implementation to parse whatever
13593 %x or %X generates, but we shouldn't require it.
13594 </p>
13595 <p><b>Proposed resolution:</b></p>
13597 <p><b>In the description:</b></p>
13598 <pre>iter_type do_get_time(iter_type s, iter_type end, ios_base&amp; str,
13599 ios_base::iostate&amp; err, tm* t) const;
13600 </pre>
13603 2 Effects: Reads characters starting at suntil it has extracted those
13604 struct tm members, and remaining format characters, used by
13605 time_put&lt;&gt;::put to produce the format specified by 'X', or until it
13606 encounters an error or end of sequence.
13607 </p>
13609 <p><b>change:</b> 'X'</p>
13611 <p><b>to:</b> "%H:%M:%S"</p>
13614 <p>Change</p>
13615 <pre>iter_type do_get_date(iter_type s, iter_type end, ios_base&amp; str,
13616 ios_base::iostate&amp; err, tm* t) const;
13618 4 Effects: Reads characters starting at s until it has extracted those
13619 struct tm members, and remaining format characters, used by
13620 time_put&lt;&gt;::put to produce the format specified by 'x', or until it
13621 encounters an error.
13622 </pre>
13624 <p>to</p>
13625 iter_type do_get_date(iter_type s, iter_type end, ios_base&amp; str,
13626 ios_base::iostate&amp; err, tm* t) const;
13628 4 Effects: Reads characters starting at s until it has extracted those
13629 struct tm members, and remaining format characters, used by
13630 time_put&lt;&gt;::put to produce one of the following formats, or until it
13631 encounters an error. The format depends on the value returned by
13632 date_order() as follows:
13634 date_order() format
13636 no_order "%m/%d/%y"
13637 dmy "%d/%m/%y"
13638 mdy "%m/%d/%y"
13639 ymd "%y/%m/%d"
13640 ydm "%y/%d/%m"
13642 An implementation may also accept additional implementation-defined formats.
13643 <pre></pre>
13645 <p><i>[Redmond: agreed that this is a real problem. The solution is
13646 probably to match C99's parsing rules. Bill provided wording.
13647 ]</i></p>
13649 <hr>
13650 <a name="464"><h3>464.&nbsp;Suggestion for new member functions in standard containers</h3></a><p><b>Section:</b>&nbsp;23.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector"> [lib.vector]</a>, 23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Thorsten Ottosen&nbsp; <b>Date:</b>&nbsp;12 May 2004</p>
13652 <p>To add slightly more convenience to vector&lt;T&gt; and map&lt;Key,T&gt; we should consider to add</p>
13653 <ol>
13654 <li> add vector&lt;T&gt;::data() member (const and non-const version)
13655 semantics: if( empty() ) return 0; else return buffer_;</li>
13656 <li> add map&lt;Key,T&gt;::at( const Key&amp; k ) member (const and non-const version)
13657 <i>semantics</i>: iterator i = find( k ); if( i != end() ) return *i; else throw range_error();</li>
13658 </ol>
13660 <p>Rationale:</p>
13662 <ul>
13663 <li>To obtain a pointer to the vector's buffer, one must use either
13664 operator[]() (which can give undefined behavior for empty vectors) or
13665 at() (which will then throw if the vector is empty). </li>
13666 <li>tr1::array&lt;T,sz&gt; already has a data() member</li>
13667 <li>e cannot use operator[]() when T is not DefaultDonstructible</li>
13668 <li>Neither when the map is const.</li>
13669 <li>when we want to make sure we don't add an element accidently</li>
13670 <li>when it should be considered an error if a key is not in the map</li>
13671 </ul>
13673 <p><b>Proposed resolution:</b></p>
13674 <p>In 23.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector"> [lib.vector]</a>, add the following to the <tt>vector</tt>
13675 synopsis after "element access" and before "modifiers":</p>
13676 <pre> // <i>[lib.vector.data] data access</i>
13677 pointer data();
13678 const_pointer data() const;
13679 </pre>
13681 <p>Add a new subsection of 23.2.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector"> [lib.vector]</a>:</p>
13682 <blockquote>
13683 <p>23.2.4.x <tt>vector</tt> data access</p>
13684 <pre> pointer data();
13685 const_pointer data() const;
13686 </pre>
13687 <p><b>Returns:</b> A pointer such that [data(), data() + size()) is a valid
13688 range. For a non-empty vector, data() == &amp;front().</p>
13689 <p><b>Complexity:</b> Constant time.</p>
13690 <p><b>Throws:</b> Nothing.</p>
13691 </blockquote>
13693 <p>In 23.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map"> [lib.map]</a>, add the following to the <tt>map</tt>
13694 synopsis immediately after the line for operator[]:</p>
13695 <pre> T&amp; at(const key_type&amp; x);
13696 const T&amp; at(const key_type&amp; x) const;
13697 </pre>
13699 <p>Add the following to 23.3.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.map.access"> [lib.map.access]</a>:</p>
13700 <blockquote>
13701 <pre> T&amp; at(const key_type&amp; x);
13702 const T&amp; at(const key_type&amp; x) const;
13703 </pre>
13705 <p><b>Returns:</b> A reference to the element whose key is equivalent
13706 to x, if such an element is present in the map.</p>
13707 <p><b>Throws:</b> <tt>out_of_range</tt> if no such element is present.</p>
13709 </blockquote>
13711 <p><b>Rationale:</b></p>
13712 <p>Neither of these additions provides any new functionality but the
13713 LWG agreed that they are convenient, especially for novices. The
13714 exception type chosen for <tt>at</tt>, <tt>std::out_of_range</tt>,
13715 was chosen to match <tt>vector::at</tt>.</p>
13716 <hr>
13717 <a name="465"><h3>465.&nbsp;Contents of &lt;ciso646&gt;</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Steve Clamage&nbsp; <b>Date:</b>&nbsp;3 Jun 2004</p>
13718 <p>C header &lt;iso646.h&gt; defines macros for some operators, such as
13719 not_eq for !=.</p>
13721 <p>Section 17.4.1.2 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-intro.html#lib.headers"> [lib.headers]</a> "Headers" says that except as noted in
13722 clauses 18 through 27, the &lt;cname&gt; C++ header contents are the same
13723 as the C header &lt;name.h&gt;. In particular, table 12 lists
13724 &lt;ciso646&gt; as a C++ header.</p>
13726 <p>I don't find any other mention of &lt;ciso646&gt;, or any mention of
13727 &lt;iso646.h&gt;, in clauses 17 thorough 27. That implies that the
13728 contents of &lt;ciso646&gt; are the same as C header &lt;iso646.h&gt;.</p>
13730 <p>Annex C (informative, not normative) in [diff.header.iso646.h] C.2.2.2
13731 "Header &lt;iso646.h&gt;" says that the alternative tokens are not
13732 defined as macros in &lt;ciso646&gt;, but does not mention the contents
13733 of &lt;iso646.h&gt;.</p>
13735 <p>I don't find any normative text to support C.2.2.2.</p>
13737 <p><b>Proposed resolution:</b></p>
13738 <p>Add to section 17.4.1.2 Headers [lib.headers] a new paragraph after
13739 paragraph 6 (the one about functions must be functions):</p>
13741 <blockquote>
13742 <p>Identifiers that are keywords or operators in C++ shall not be defined
13743 as macros in C++ standard library headers.
13744 [Footnote:In particular, including the standard header &lt;iso646.h&gt;
13745 or &lt;ciso646&gt; has no effect. </p>
13746 </blockquote>
13748 <p><i>[post-Redmond: Steve provided wording.]</i></p>
13750 <hr>
13751 <a name="467"><h3>467.&nbsp;char_traits::lt(), compare(), and memcmp()</h3></a><p><b>Section:</b>&nbsp;21.1.3.1 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-strings.html#lib.char.traits.specializations.char"> [lib.char.traits.specializations.char]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jun 2004</p>
13754 Table 37 describes the requirements on Traits::compare() in terms of
13755 those on Traits::lt(). 21.1.3.1, p6 requires char_traits&lt;char&gt;::lt()
13756 to yield the same result as operator&lt;(char, char).
13757 </p>
13760 Most, if not all, implementations of char_traits&lt;char&gt;::compare()
13761 call memcmp() for efficiency. However, the C standard requires both
13762 memcmp() and strcmp() to interpret characters under comparison as
13763 unsigned, regardless of the signedness of char. As a result, all
13764 these char_traits implementations fail to meet the requirement
13765 imposed by Table 37 on compare() when char is signed.
13766 </p>
13769 <p>Read email thread starting with c++std-lib-13499 for more. </p>
13770 <p><b>Proposed resolution:</b></p>
13773 <p>Change 21.1.3.1, p6 from</p>
13774 <blockquote>
13775 The two-argument members assign, eq, and lt are defined identically
13776 to the built-in operators =, ==, and &lt; respectively.
13777 </blockquote>
13778 <p>to</p>
13779 <blockquote>
13780 The two-argument member assign is defined identically to
13781 the built-in operator =. The two
13782 argument members eq and lt are defined identically to
13783 the built-in operators == and &lt; for type unsigned char.
13784 </blockquote>
13786 <p><i>[Redmond: The LWG agreed with this general direction, but we
13787 also need to change <tt>eq</tt> to be consistent with this change.
13788 Post-Redmond: Martin provided wording.]</i></p>
13790 <hr>
13791 <a name="468"><h3>468.&nbsp;unexpected consequences of ios_base::operator void*()</h3></a><p><b>Section:</b>&nbsp;27.4.4.3 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.iostate.flags"> [lib.iostate.flags]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jun 2004</p>
13793 <p>The program below is required to compile but when run it typically
13794 produces unexpected results due to the user-defined conversion from
13795 std::cout or any object derived from basic_ios to void*.
13796 </p>
13798 <pre> #include &lt;cassert&gt;
13799 #include &lt;iostream&gt;
13801 int main ()
13803 assert (std::cin.tie () == std::cout);
13804 // calls std::cout.ios::operator void*()
13806 </pre>
13808 <p><b>Proposed resolution:</b></p>
13811 Replace std::basic_ios&lt;charT, traits&gt;::operator void*() with another
13812 conversion operator to some unspecified type that is guaranteed not
13813 to be convertible to any other type except for bool (a pointer-to-member
13814 might be one such suitable type). In addition, make it clear that the
13815 pointer type need not be a pointer to a complete type and when non-null,
13816 the value need not be valid.
13817 </p>
13819 <p>Specifically, change in [lib.ios] the signature of</p>
13820 <pre> operator void*() const;
13821 </pre>
13822 <p>to</p>
13823 <pre> operator unspecified-bool-type() const;
13824 </pre>
13825 <p>and change [lib.iostate.flags], p1 from</p>
13826 <pre> operator void*() const;
13827 </pre>
13828 <p>to</p>
13829 <pre>operator unspecified-bool-type() const;
13831 -1- Returns: if fail() then a value that will evaluate false in a
13832 boolean context; otherwise a value that will evaluate true in a
13833 boolean context. The value type returned shall not be
13834 convertible to int.
13836 -2- [Note: This conversion can be used in contexts where a bool
13837 is expected (e.g., an if condition); however, implicit
13838 conversions (e.g., to int) that can occur with bool are not
13839 allowed, eliminating some sources of user error. One possible
13840 implementation choice for this type is pointer-to-member. - end
13841 note]
13842 </pre>
13844 <p><i>[Redmond: 5-4 straw poll in favor of doing this.]</i></p>
13845 <p><i>[Lillehammer: Doug provided revised wording for
13846 "unspecified-bool-type".]</i></p>
13848 <hr>
13849 <a name="469"><h3>469.&nbsp;vector&lt;bool&gt; ill-formed relational operators</h3></a><p><b>Section:</b>&nbsp;23.2.5 <a href="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#DR">DR</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;28 Jun 2004</p>
13852 The overloads of relational operators for vector&lt;bool&gt; specified
13853 in [lib.vector.bool] are redundant (they are semantically identical
13854 to those provided for the vector primary template) and may even be
13855 diagnosed as ill-formed (refer to Daveed Vandevoorde's explanation
13856 in c++std-lib-13647).
13857 </p>
13859 <p><b>Proposed resolution:</b></p>
13861 Remove all overloads of overloads of relational operators for
13862 vector&lt;bool&gt; from [lib.vector.bool].
13863 </p>
13864 <hr>
13865 <a name="474"><h3>474.&nbsp;confusing Footnote 297</h3></a><p><b>Section:</b>&nbsp;27.6.2.5.4 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-iostreams.html#lib.ostream.inserters.character"> [lib.ostream.inserters.character]</a>&nbsp; <b>Status:</b>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;Martin Sebor&nbsp; <b>Date:</b>&nbsp;1 Jul 2004</p>
13868 I think Footnote 297 is confused. The paragraph it applies to seems
13869 quite clear in that widen() is only called if the object is not a char
13870 stream (i.e., not basic_ostream&lt;char&gt;), so it's irrelevant what the
13871 value of widen(c) is otherwise.
13872 </p>
13873 <p><b>Proposed resolution:</b></p>
13875 I propose to strike the Footnote.
13876 </p>
13877 <hr>
13878 <a name="496"><h3>496.&nbsp;Illegal use of "T" in vector&lt;bool&gt;</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#WP">WP</a>&nbsp; <b>Submitter:</b>&nbsp;richard@ex-parrot.com&nbsp; <b>Date:</b>&nbsp;10 Feb 2005</p>
13880 In the synopsis of the std::vector&lt;bool&gt; specialisation in 23.2.5 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lib-containers.html#lib.vector.bool"> [lib.vector.bool]</a>,
13881 the non-template assign() function has the signature</p>
13883 <pre> void assign( size_type n, const T&amp; t );
13884 </pre>
13886 <p>The type, T, is not defined in this context.</p>
13887 <p><b>Proposed resolution:</b></p>
13888 <p>Replace "T" with "value_type".</p>
13889 <p>----- End of document -----</p>
13890 </body></html>